Thread - début puis sortie immédiate

Résolu
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010 - 21 janv. 2010 à 09:47
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010 - 8 févr. 2010 à 21:33
Bonjour à tous,

je vous explique mon problème :

Quand je lance mon thread depuis mon application principale avec un bouton, des fois, il entre puis sort immédiatement du thread...

Dans le journal d'événements, j'ai :
Début du Thread : ID du thread : 3276. Processus asfasdf.exe...
Sortie du Thread : ID du thread : 3276. Processus asfasdf.exe...
Début du Thread : ID du thread : 3496. Processus asfasdf.exe...
Sortie du Thread : ID du thread : 3496. Processus asfasdf.exe...
Début du Thread : ID du thread : 1976. Processus asfasdf.exe...
...

Je dois cliquer plusieurs fois sur le bouton et au bout d'un moment, le thread se lance... Comment faire pour remédier à ce problème ?

D'avance merci pour vos réponses, bonne journée.

9 réponses

Utilisateur anonyme
8 févr. 2010 à 15:19
Je t'ai fais un exemple Tapez le texte de l'url ici.
3
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010
21 janv. 2010 à 15:56
up
0
Utilisateur anonyme
22 janv. 2010 à 08:10
Down .

Syphon : Pas la peine de relancer ton topic , il a été vu . Si tu n'as eu aucune réponse c'est que

1)Ta question n'est pas claire.
2)Tu ne donnes aucun code : Sans, on ne peut pas te dire d'ou vient le problème
3)Cirec t'a déjà renvoyé vers un source qui fonctionne parfaitement : A toi de savoir l'exploiter.
0
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 11:39
Bonjour,

L'aide de Cirec m'a été d'une précieuse utilité. Mais j'ai néanmoins toujours ce problème.

Je dois cliquer plusieurs fois sur mon bouton pou pouvoir exécuter le thread.

Voici un bout de code :
dans mon Main :

[b]procedure TfmMain.button1(Sender: TObject);
threadSeg : ThreadSeg;
begin

threadSeg := threadSeg.Create(true);
threadSeg.Resume;
end;/b

dans le thread :
[b]constructor threadSeg.Create(CreateSuspended:boolean);
begin
inherited Create(CreateSuspended);
Priority:=tpNormal;
FreeOnTerminate := true;
end;

destructor threadSeg.Destroy;
begin
//déchargez la mémoire ici si vous avez créé des objets
inherited;
end;


procedure threadSeg.Execute;
begin
{code}
end;/b

En espérant avoir été claire cette fois ci, je vous remercie pour vos messages

Salutations
0

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

Posez votre question
Utilisateur anonyme
8 févr. 2010 à 12:51
Salut

code non testé et pompé goulument sur le tuto de GrandVizir

unit ThreadSegUnit;


interface
uses Windows, Classes, SysUtils;

type
  TThreadSeg = class(TThread)
  private
    procedure CentralControl;
  public
    constructor Create(CreateSuspended:boolean);
     destructor Destroy; override;
  protected
    procedure Execute; override;
  end;

implementation

constructor TThreadSeg.Create(CreateSuspended:boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:=false;
  Priority:=tpNormal;
end;

destructor TThreadSeg.Destroy;
begin
  //déchargez la mémoire ici si vous avez créé des objets
  inherited;
end;

procedure TThreadSeg.CentralControl;
begin
  //écrivez ici ce que doit faire votre thread à un instant T donné
end;

procedure TThreadSeg.Execute;
begin
  repeat
    Sleep(500); //en millisecondes
    Synchronize(CentralControl);
  until Terminated;
end;
end.


A utiliser ainsi

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ThreadSegUnit;

type
  TForm1 = class(TForm)
    ButtonThread: TButton;
    procedure ButtonThreadClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    ThreadSeg:TThreadSeg;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonThreadClick(Sender: TObject);
begin
  If Assigned(ThreadSeg) Then
    Begin
  ThreadSeg.Suspend;
  ThreadSeg.Free;
End;
  ThreadSeg:=TThreadSeg.Create(true);
  ThreadSeg.Resume;
end;


Dans ton code, tu avais oublié de suspendre et supprimer ton thread. Ton problème venait surement de là.
0
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 13:16
Merci pour ton aide.

ça ne marche toujours pas, au premier clic sur le bouton il y début du thread puis immédiatement sortie du thread comme avant et au 2ème clic sur le bouton, il y une exception avec message "Erreur de thread : Descripteur non valide (6)"

Je ne comprends pas, pourtant j'ai exactement suivi le code ci-dessus...
0
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 14:53
Il doit y avoir un problème lors du clic sur le bouton. Car le thread ne se lance même pas...

Journal d'événements :
Début du Thread : ID du thread : 3276. Processus asfasdf.exe...
Sortie du Thread : ID du thread : 3276. Processus asfasdf.exe...
Début du Thread : ID du thread : 3496. Processus asfasdf.exe...
Sortie du Thread : ID du thread : 3496. Processus asfasdf.exe...
Début du Thread : ID du thread : 1976. Processus asfasdf.exe...

au bout du 3ème coup, le thread s'exécute.
Quelqu'un sait pourquoi il ne s'exécute pas tout de suite ?
0
Utilisateur anonyme
8 févr. 2010 à 15:16
Re,

Je viens de tester : le code que je t'ai passé fonctionne parfaitement (Aucune erreur malgré plusieurs click de réalisé).

Donc deux solutions : soit tu as modifié un truc dans le code que je t'ai passé, soit le problème vient d'ailleurs.
0
syphon22 Messages postés 11 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 8 février 2010
8 févr. 2010 à 21:33
Merci pour cet exemple,

je vais chercher ailleurs alors ;)

Salutations, bonne soirée et merci encore.
0
Rejoignez-nous