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 :
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
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() ; }
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() ; } }
Partager