pause et reprise de thread
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:
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:
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() ; }
} |