IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Arrêter un IdThreadComponent lors de son exécution


Sujet :

Delphi

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut Arrêter un IdThreadComponent lors de son exécution
    Salut,

    Je développe un software avec Delphi 2006 et Indy 10 sous WinXP.

    J'ai un IdThreadComponent qui effectue une tâche dans l'évènement Onrun.

    J'aimerais en cliquant sur un bouton l'arrêter si il travaille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button5Click(Sender: TObject);
    begin
      if (IdThread_Test.Stopped = False) then
        begin
          IdThread_Test.Stop;
        end;
    end;
    Malheureusement ce code ne fonctionne pas ...

    D'avance merci pour vos réponses.

  2. #2
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Personne n'a la moindre idée de comment arrêter un IdThreadComponent pendant qu'il travaille ?

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    j'ai pas trouver la propriété stpop
    voir simplement if ActiveThreads then TerminateThreads
    désolé
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    J'ai essayé plusieurs possibilités d'après ce que tu m'as dis edam :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button5Click(Sender: TObject);
    begin
      if (IdThread_Test.Stopped = False) then
        begin
          IdThread_Test.Terminate;
        end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button5Click(Sender: TObject);
    begin
      if (IdThread_Test.Active = True) then
        begin
          IdThread_Test.Terminate;
        end;
    end;
    Aucune des deux ne fonctionne ...

    Il doit surement y avoir moyen d'arrêter un Thread qui travaille !

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    comment sait tu que votre thréad n'est pas arrété??
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Parce que j'ai créé justement un Thread spécialement pour apprendre à l'arrêter :

    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
    23
    24
    procedure TForm1.IdThread_TestRun(Sender: TIdThreadComponent);
    var
      i : Integer;
     
    begin
      for i := 0 to 50000 do
        begin
          Label1.Caption := IntToStr(i);
        end;
      IdThread_Test.Stop;
    end;
     
    procedure TForm1.PlayClick(Sender: TObject);
    begin
      IdThread_Test.Start;
    end;
     
    procedure TForm1.StopClick(Sender: TObject);
    begin
      if (IdThread_Test.Active = True) then
        begin
          IdThread_Test.Stop;
        end;
    end;
    Je met donc dans le bouton Stop la fonction qui est censé arrêter le Thread et tant que le Label1 continue à afficher des nombres c'est que j'ai pas réussi à l'arrêter ...

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je vais peut etre dir une betise
    mais tu peut mettre une point d'arret dans stopclik pour voir si il répond
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  8. #8
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par edam
    je vais peut etre dir une betise
    mais tu peut mettre une point d'arret dans stopclik pour voir si il répond
    J'ai mis un point d'arrêt au niveau du bouton Stop et le logiciel s'arrête quand on clique sur le bouton, mais je ne vois pas à quoi ça avance.

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    tu peut donner le corp de votre thréd??? la procedure execute
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  10. #10
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Je l'ai déjà donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.IdThread_TestRun(Sender: TIdThreadComponent);
    var
      i : Integer;
    begin
      for i := 0 to 50000 do
        begin
          Label1.Caption := IntToStr(i);
        end;
      IdThread_Test.Stop;
    end;

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    essay
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <div style="text-align: left;">procedure TForm1.IdThread_TestRun(Sender: TIdThreadComponent);
    var
      i : Integer;
    begin
    i:=0
    while (i<50000) and (not IdThread_Test.Stopped) do  
        begin
          inc(i);
          Label1.Caption := IntToStr(i);
        end;
      IdThread_Test.Stop;
    end;</div>en plus, normalement  on accéde pas au vcl dans un thréad?????:koi:
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    En effet, avec ton code ça fonctionne très bien. On arrive à arrêter le Thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.IdThread_TestRun(Sender: TIdThreadComponent);
    var
      i : Integer;
     
    begin
      i:=0;
      while (i < 50000) and (not IdThread_Test.Stopped) do
        begin
          inc(i);
          Label1.Caption := IntToStr(i);
        end;
      IdThread_Test.Stop;
    end;
    Mais le problème est qu'on ne fait que stopper le processus, ce qui peut être pratique dans certaines situations. J'aimerais dés lors effectuer un bouton "Pause".

    Y aurait il une fonction ou un système qui permettrait de faire facillement une pause au TThread ?

    Citation Envoyé par edam
    en plus, normalement on accéde pas au vcl dans un thréad?????
    Dans ce cas, comment fais-t'on pour effectuer une boucle sur la vcl si chacun des cycles durent plusieurs secondes et que l'on ne veut pas bloquer toute l'application ?

  13. #13
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par xenos
    Y aurait il une fonction ou un système qui permettrait de faire facillement une pause au TThread ?
    voir l'aide en ligne sur les thréad
    TThread.Suspend

    Interrompt l'exécution du thread.
    procedure Suspend;
    Description
    Appelez Suspend pour interrompre temporairement l'exécution du thread. Pour reprendre l'exécution après un appel à Suspend, appelez Resume. Il est possible d'imbriquer les appels de la méthode Suspend; Resume doit alors être appelée le même nombre de fois que Suspend avant que l'exécution du thread reprenne.
    et pour reprendre
    TThread.Resume

    Reprend l'exécution d'un thread interrompu.
    procedure Resume;
    Description
    Appelez Resume pour provoquer un thread suspendu pour redémarrer. Il est possible d'imbriquer les appels de la méthode Suspend; Resume doit alors être appelée le même nombre de fois que Suspend avant que l'exécution du thread reprenne.
    pour accéed au VCL toujour dans l'aide en ligne:
    TThread.Synchronize

    Exécute un appel de méthode dans le thread VCL principal.
    type TThreadMethod = procedure of object;
    procedure Synchronize(Method: TThreadMethod);
    Description
    Synchronize provoque l'exécution de l'appel spécifié de la méthode spécifiée par Method par le thread CLX principal, ce qui évite les conflits multithread. Si vous n'êtes pas sûr qu'un appel de méthode soit adapté à l'utilisation de threads, appelez-le depuis le thread CLX principal, en lui étant transmis par la méthode Synchronize.
    L'exécution du thread est interrompue tant que Method s'exécute dans le thread CLX principal.
    Remarque : Vous pouvez aussi protéger les méthodes non sécurisées en utilisant des sections critiques ou le synchroniseur en écriture exclusive multi-lecture.
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  14. #14
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour ta réponse Edam.

    Cependant, il semblerait que les informations que tu m'as fournies ne sont pas valables pour les IdThreadComponent ...

    Lorsque je compile le soft, il parle d'identifiant non déclaré ... et à première vue il n'y a pas de clauses Uses à rajouter.

    Cependant pourrais tu quand même me donner le site sur lequel tu as trouvé ces informations ?

    Bien entendu, ma question reste ouverte, comment suspendre un IdThreadComponent vu que les procédures suspend et resume ne semblent pas fonctionner.

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    tout est dans l'aide de delphi
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

Discussions similaires

  1. trigger me signal une erreur lors de son exécution
    Par scofild20 dans le forum SQL
    Réponses: 7
    Dernier message: 02/05/2009, 14h22
  2. Réponses: 7
    Dernier message: 09/11/2008, 22h33
  3. Réponses: 2
    Dernier message: 07/01/2008, 18h01
  4. Arrêter une macro durant son exécution
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/10/2007, 14h30
  5. Limiter la charge lors de l'exécution de son application
    Par Bazunga dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/07/2007, 23h16

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