Passer variable de winform à classe Program du projet

Résolu
maintenance_info Messages postés 64 Date d'inscription lundi 5 juin 2017 Statut Membre Dernière intervention 2 novembre 2023 - 10 déc. 2020 à 19:31
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 17 déc. 2020 à 15:04
Bonjour,
Afin de détecter la fermeture de l application soit par un clic sur la croix rouge de winform ou par le gestionnaire de tache,
J ai trouver une fonction qui s implimente dans la classe program du projet,
J ai modifier le code en ajoutant une fonction qui inserre une ligne dans BD sqlserver pour récupérer la date du fermeture.
Le projet est un formulaire qui contient un textbox
Maintenant je veux récupérer ce champs dans la fonction sqlserver pour l enregiqtrer dans la base.
Merci d avance.

8 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
10 déc. 2020 à 20:22
Bonjour

dans ma boule de cristal, je vois qu'il manque un "demi" à la ligne 1664.

Ha pardon, tu voulais une réponse utile?
Nous ne sommes pas magicien, d'ailleurs, à ton précédent fil, tu n'as pas posé de question, donc t'as pas eu de réponse....

Si tu veux de l'aide, il faut nous donner de quoi comprendre de quoi tu parles.

Commence par la classe Program que tu as modifiée....

Rappel, pour poster un code il faut faire comme décrit sur ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

0
maintenance_info Messages postés 64 Date d'inscription lundi 5 juin 2017 Statut Membre Dernière intervention 2 novembre 2023 1
11 déc. 2020 à 07:53
Rebonjour:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Avancement_OFS
{
    static class Program
    {

  
        static Process checker;
        static Process main;
        static int mainProcessID;
     
        [STAThread]
      
        static void Main(string[] args)
        {
                    
            if (args.Length == 0)
            {
                //Saves current process info to pass on command line.
                main = Process.GetCurrentProcess();
                mainProcessID = main.Id;

                //Initializes the helper process
                checker = new Process();
                checker.StartInfo.FileName = main.MainModule.FileName;
                checker.StartInfo.Arguments = mainProcessID.ToString();

                checker.EnableRaisingEvents = true;
                checker.Exited += new EventHandler(checker_Exited);

                //Launch the helper process.
                checker.Start();

                Application.Run(new Authentification());
                
               
            }
            else //On the helper Process
            {
                main = Process.GetProcessById(int.Parse(args[0]));

                main.EnableRaisingEvents = true;
                main.Exited += new EventHandler(main_Exited);

                while (!main.HasExited)
                {
                    Thread.Sleep(9000); //Wait 1 second. 
                   
                }

                //Provide some time to process the main_Exited event. 
                Thread.Sleep(10000);
            }
        }

        static void checker_Exited(object sender, EventArgs e)
        {
           
            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
          SqlConnection cnx_save_trace = new SqlConnection(" Data Source=***;Initial Catalog=OFS_DEV;Integrated Security=True");

                SqlCommand cmd_save = new SqlCommand("insert into SUIVI_ACTIVITE_USER([USER_NAME],[DT])values(@name,@dt_s)", cnx_save_trace);
                cnx_save_trace.Open();
                cmd_save.Parameters.AddWithValue("@name",user);//Recuperer de la form Authentification

                cmd_save.Parameters.AddWithValue("@dt_s", DateTime.Now);


                cmd_save.ExecuteNonQuery();
                cnx_save_trace.Close();
                //MessageBox.Show("Task Manager killed helper process.");

                //If you like you could kill the main app here to. 
                //main.Kill();
            }
        }
        static void main_Exited(object sender, EventArgs e)
        {
           
            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
                SqlConnection cnx_save_trace = new SqlConnection(" Data Source=***;Initial Catalog=OFS_DEV;Integrated Security=True");

                SqlCommand cmd_save = new SqlCommand("insert into SUIVI_ACTIVITE_USER([USER_NAME],[DT])values(@name,@dt_s)", cnx_save_trace);
                cnx_save_trace.Open();
                cmd_save.Parameters.AddWithValue("@name",user);//Recuperer de la form Authentification

                cmd_save.Parameters.AddWithValue("@dt_s", DateTime.Now);


                cmd_save.ExecuteNonQuery();
                cnx_save_trace.Close();
            }
        }
    }
}

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
11 déc. 2020 à 14:39
Bonjour

Si je comprends bien ( j’ai pas pu tester pour l’instant, demain peut-être), tu lances le programme sans arguments.
Ça 2 effets
  • ça lance ta fenêtre principale
  • ça lance une seconde fois ton programme avec son propre nom en arguments.


C’est ce second lancement qui scrute si l’application a été tuée.

Dans ce cas l’appli est 2 fois dans le gestionnaire des taches, du coup si on tue le mauvais, il ne se passe rien? C’est correct?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
12 déc. 2020 à 19:39
Bonsoir

j'ai fait quelques tests, j'ai modifié un peu le code pour écrire dans un fichier texte (j'allais pas crée une bdd rien que pour ça) et logguer un peu plus d'infos.

        static Process checker;
        static Process main;
        static int mainProcessID;

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                File.AppendAllText("log.txt", "Démarrage normal\r\n");

                //Saves current process info to pass on command line.
                main = Process.GetCurrentProcess();
                mainProcessID = main.Id;

                //Initializes the helper process
                checker = new Process();
                checker.StartInfo.FileName = main.MainModule.FileName;
                checker.StartInfo.Arguments = mainProcessID.ToString();

                checker.EnableRaisingEvents = true;
                checker.Exited += new EventHandler(checker_Exited);

                //Launch the helper process.
                checker.Start();

                Application.Run(new Form1());


            }
            else //On the helper Process
            {
                File.AppendAllText("log.txt", "Démarrage supervision\r\n");

                main = Process.GetProcessById(int.Parse(args[0]));

                main.EnableRaisingEvents = true;
                main.Exited += new EventHandler(main_Exited);

                while (!main.HasExited)
                {
                    Thread.Sleep(9000); //Wait 1 second. 

                }

                //Provide some time to process the main_Exited event. 
                Thread.Sleep(10000);
            }
        }


        static void checker_Exited(object sender, EventArgs e)
        {
            File.AppendAllText("log.txt", "checker_Exited\r\n");

            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
                File.AppendAllText("log.txt", string.Format("task manager ouvert à {0:yyyy-MM-DD_HH-mm-ss}\r\n", DateTime.Now));
            }
        }

        static void main_Exited(object sender, EventArgs e)
        {
            File.AppendAllText("log.txt", "main_Exited\r\n");

            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
                File.AppendAllText("log.txt", string.Format("task manager ouvert à {0:yyyy-MM-DD_HH-mm-ss}\r\n", DateTime.Now));
            }
        }


et ça correspond plus ou moins à ce que j'avais anticipé.

Il y a bien 2 "sous instances" de mon logiciel


Form1, c'est mon "vrai" logiciel" et "Test" c'est le checker.

Si je ferme normalement, ça passe dans main_Exited et si j'ai pas le gestionnaire des tache ouvert, ça ne loggue rien de plus, par contre s'il est ouvert ça me dit qu'il est ouvert (quand bien même je n'ai pas tué mon logiciel).
Les 2 sous instances sont éteintes.

Si je tue Form1, il se passe exactement la même chose, donc ton code ne distingue pas si le logiciel a été éteint "normalement" ou s'il a été "tué".

Si je tue le checker, ça loggue bien le passage dans checker_Exited et ça signale que le le gestionnaire des taches est ouvert.

Par contre, Form1 tourne toujours et plus rien n'est loggué par la suite.



Du coup, je ne voies pas l'intérêt de lancer le chercker.

Peux tu mettre le lien du site où tu avais trouvé ce code?


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
12 déc. 2020 à 21:40
En fait,je viens de m'apercevoir, que j'avais 8 processus de checker en arrière plan.....
Donc, ils ne se ferment pas comme il faut dans je ne sais pas quel cas.....

0
maintenance_info Messages postés 64 Date d'inscription lundi 5 juin 2017 Statut Membre Dernière intervention 2 novembre 2023 1
Modifié le 17 déc. 2020 à 11:43
merci beaucoup pour la réponse,
est ce que je peux l'inserrer directement dans le code winfom.??

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
17 déc. 2020 à 12:49
  • je n’ai rien changé sur le fond de ton code (log dans un fichier texte au lieu d’une base de données)
  • je t’ai expliqué en quoi je ne le trouve pas génial ton truc
  • je t’ai demandé le lien vers le site où tu l’as trouvé (pour voir si tu l’avais adapté au mieux)


Et toi tu réponds
est ce que je peux l'inserrer directement dans le code winfom.??


Je ne te comprends pas....
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
17 déc. 2020 à 15:04
Ha c’est résolu finalement ?
0
Rejoignez-nous