1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    août 2008
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 622
    Points : 577
    Points
    577

    Par défaut Thread Fermer application

    Bonjour,

    J'ai un thread pour faire une vérification. Lors de de son exécution, je vérifie une valeur: si elle n'est pas la valeur que j'attends, l'application se referme(Application.Terminate). Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      TUSBThread = class(TThread)
     
      protected
        procedure Execute; override;
     
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
     
    MonUSBThread : TUSBThread ;   //THREAD -------------

    Le bouton pour lancer ce Thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    MonUSBThread := TUSBThread.Create(True); 
    MonUSBThread.FreeOnTerminate := True; 
    MonUSBThread.Priority := tpNormal;  
    MonUSBThread.Resume; 
    end;
    Procedure d'éxécution du thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure TUSBThread.Execute;
     
    var FichierIni: Tinifile;
    MaValeur : String  ;
     
    begin
     
    Form1.RefreshData;  // Procedure personnelle
     
    Sleep(500);
     
    FichierIni := TIniFile.Create(ExtractFilePath(Application.ExeName)+'.\MonFichier.ini');
    MaValeur := (FichierIni.ReadString('Nom','Controle', ''));
     
    if NOT  (MaValeur = 'xxxx')  then begin
    MonUSBThread.Terminate;
    Application.terminate ;
    end;
     
    Fichierini.Free;
     
    end;
    Le code s'exécute sans aucun soucis sauf dans la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if NOT  (MaValeur = 'xxxx')  then begin
    MonUSBThread.Terminate;
    Application.terminate ;
    end;
    si "MaValeur" n'est pas égale à "xxxx " , alors l'application continue à tourner, elle ne se referme pas.
    Il y a sûrement une erreur de ma part.

    Merci pour votre aide.

    Bonne journée.

  2. #2
    Membre expérimenté Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 137
    Points : 1 652
    Points
    1 652

    Par défaut

    Bonjour,

    je pense que tu devrais mettre la libération du ini avant le If NOT.

    Mais pour essayer de trouver la solution, tu pourrais écrire MaValeur dans un fichier Log pour voir si sa valeur est correcte. et ensuite regarder si tu passes bien dans le If ?

    A+
    Charly

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    9 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 015
    Points : 21 621
    Points
    21 621
    Billets dans le blog
    9

    Par défaut

    Bonjour,

    je vérifierai quand même la valeur de ExtractFilePath(Application.ExeName)+'.\MonFichier.ini'à vrai dire, le .\ me gêne

    un petit code rapide pour tester
    1- ExtractFilePath(Application.ExeName)+'.\MonFichier.ini' donne C:\Users\Serge\Documents\Embarcadero\Studio\Projets\Win32\Debug\.\MonFichier.ini
    2- ExtractFilePath(ExtractFileDir(Application.ExeName))+'Monfichier.ini' donne C:\Users\Serge\Documents\Embarcadero\Studio\Projets\Win32\Monfichier.ini

    je pense que c'est le 2 que tu veux obtenir ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  4. #4
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    août 2008
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 622
    Points : 577
    Points
    577

    Par défaut

    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    je pense que tu devrais mettre la libération du ini avant le If NOT.

    Mais pour essayer de trouver la solution, tu pourrais écrire MaValeur dans un fichier Log pour voir si sa valeur est correcte. et ensuite regarder si tu passes bien dans le If ?

    A+
    Charly
    Bonjour,
    Merci pour vos réponses surtout que vous êtes en week-end.

    Je ne pense pas que cela vient du fichiers ini. Je suis presque persuadé que l'erreur vient de la construction du thread lui-même. Il ne "se tue" pas même
    quand l'application se referme, il continue à tourner.

    @ Serge,

    Le chemin ne pose pas problème, la preuve, si je mets le code du thread dans un Bouton, il marche sans aucun soucis sauf que l'application se fige et c'est pour cette raison que je lai mis dans un thread.

    A+

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 545
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 545
    Points : 9 441
    Points
    9 441

    Par défaut

    Les thread est assez mal fait, on n'accède pas à la VCL sans synchronisation.

    Citation Envoyé par NABIL74 Voir le message
    si je mets le code du thread dans un Bouton, il marche sans aucun soucis sauf que l'application se fige
    C'est peut-être par là qu'il faudrait commencer non ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    août 2008
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 622
    Points : 577
    Points
    577

    Par défaut

    Citation Envoyé par Andnotor Voir le message
    Les thread est assez mal fait, on n'accède pas à la VCL sans synchronisation.

    C'est peut-être par là qu'il faudrait commencer non ?
    Bonsoir,

    Oui t'as raison Andnotor. Pour être franc, je n'ai pas beaucoup travaillé avec les threads .

    La procedure Execute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TUSBThread.Execute;
     begin
     Form1.RefreshData;  // Procedure personnelle
    
    Synchronize(ControleDATA); //synchronisation 
    end;

    Une nouvelle procedure pour la synchronisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure ControleDATA;
    var FichierIni: Tinifile;
    MaValeur : String  ;
     
    begin
     
    FichierIni := TIniFile.Create(ExtractFilePath(Application.ExeName)+'.\MonFichier.ini');
    MaValeur := (FichierIni.ReadString('Nom','Controle', ''));
     
    if NOT  (MaValeur = 'xxxx')  then begin
    //MonUSBThread.Terminate;
    Application.terminate ;
    end;
     
    Fichierini.Free;
    Est-ce correcte cela stp?

    Merci pour ton aide.

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 545
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 545
    Points : 9 441
    Points
    9 441

    Par défaut

    Tu dois d'abord déterminer pourquoi l'application se fige avant de rajouter une couche avec une tâche secondaire.

    Sinon, Form1.RefreshData et Application.terminate doivent être synchronisés. La lecture du fichier et le test (plutôt à base de AnsiSameText) peuvent être asynchrones.

  8. #8
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    août 2008
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 622
    Points : 577
    Points
    577

    Par défaut

    Bonjour,

    Tu dois d'abord déterminer pourquoi l'application se fige avant de rajouter une couche avec une tâche secondaire.
    Andnotor, la procedure Form1.RefreshData est une procédure de calcul. L'application se fige (pendant quelques secondes: 5 - 7 secondes) quand je lance cette procedure , mais après ce temps, l'application tourne normalement.

    Le code du thread que j'ai publié, fonctionne correctement sauf que l'application ne se referme pas.

    Ton avis? Faut-il corriger ce thread stp?

    Merci

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 545
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 545
    Points : 9 441
    Points
    9 441

    Par défaut

    Citation Envoyé par NABIL74 Voir le message
    Andnotor, la procedure Form1.RefreshData est une procédure de calcul.
    Peu importe, tu fais appel à Form1. Que se passe-t-il si Form1 est fermée alors que le calcul est en cours (durant ces 5-7 secondes) ?
    RefreshData devrait être membre de TUSBThread.

    Citation Envoyé par NABIL74 Voir le message
    Le code du thread que j'ai publié, fonctionne correctement sauf que l'application ne se referme pas.
    Application.terminate doit être synchronisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure TUSBThread.Execute;
    var
      MaValeur :String;
     
    begin
      RefreshData;  // Procedure locale
     
      with TIniFile.Create(ParamStr(0) +'MonFichier.ini') do
      try
        MaValeur := ReadString('Nom','Controle', '');
     
        if not AnsiSameText(MaValeur, 'xxxx') then
          Synchronize(procedure
                      begin
                        Application.Terminate;
                      end);
      finally
        Free;
      end;
    end;
    Si ça ne fonctionne pas, le problème est ailleurs.

  10. #10
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    août 2008
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 622
    Points : 577
    Points
    577

    Par défaut

    Bonsoir,

    Citation Envoyé par Andnotor Voir le message
    Peu importe, tu fais appel à Form1. Que se passe-t-il si Form1 est fermée alors que le calcul est en cours (durant ces 5-7 secondes) ?
    L'application se referme normalement.

    Ton dernier code ne termine pas l'application par contre ton idée ('on n'accède pas à la VCL sans synchronisation') , m'a permis d’atterrir là où je veux aller.
    Après plusieurs test, mon code du post #6 fait l'affaire.

    Merci beaucoup pour ton aide Andnotor
    Il toujours fort ce Andnotor

    Bonne soirée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread et Application principale: Event,Message..?
    Par ghost942 dans le forum Delphi
    Réponses: 17
    Dernier message: 30/05/2007, 18h32
  2. Utiliser les threads dans application Struts
    Par rach375 dans le forum Struts 1
    Réponses: 7
    Dernier message: 18/09/2006, 11h32
  3. [VB6] fermer application ouverte avec shellexecute
    Par prodi_64 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 24/04/2006, 17h36
  4. [thread] fermer une application
    Par FFF dans le forum APIs
    Réponses: 11
    Dernier message: 10/12/2005, 21h04
  5. Réponses: 3
    Dernier message: 11/02/2004, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo