Salut !

Bon je developpe un programme qui doit piloter un moteurs pas à pas. Pour cela j'ai une interface qui lance un thread contenant les ordres de déplacements des moteurs. Sur cette interface je veux mettre un bouton pause/reprise et un bouton arrêt d'urgence. Mon problème est le suivant : l'appel de la méthode suspend () du thread est inefficasse, le mouvement continue toujours.

Merci de votre aide.

code de l'interface :
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
25
26
27
28
29
30
31
32
33
34
 
 
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
 
void __fastcall TForm1::threadClick(TObject *Sender)
{
 generationthread () ;
}
void __fastcall TForm1::killerClick(TObject *Sender)
{
try {
monthread->Terminate() ; }
catch ( const EThread &e ) { ShowMessage ("thread fini avant"); return ;}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pauseClick(TObject *Sender)
{
  //compteur initialisé à 0 dans le header
try {
if ( compteur == 0 ) { monthread->Suspend(); compteur++ ; }
   else  { monthread->Resume() ; compteur-- ; }
   }
catch ( const EThread &e ) { ShowMessage ("thread inexistant");}
}
//---------------------------------------------------------------------------
void TForm1::generationthread ()  //creation du thread
{
  monthread = new essais ( true ) ;
  monthread->FreeOnTerminate = true ;
  monthread->Resume() ;
}
et le code 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
23
24
25
26
27
 
__fastcall essais::essais(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall essais::Execute()
{
if (!Terminated){
 
a.ymove(-2000) ; // ordre de bouger à la position -2000
a.yfinmove() ;  //attente bloquante de fin de mouvement
Sleep ( 500 ) ;
}
 
if (!Terminated){
 
a.ymove(0) ; //ordre de revenir à la position de départ
a.yfinmove() ;  //attente bloquante de fin de mouvement
Sleep ( 500 ) ;
 
}
 
//le thread appel une méthode de l'interface pour générer un nouveau thread
// identique
if (!Terminated){ Form1->generationthread() ; }
}