Sortir d'une boucle while infinie avec un bouton

bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004 - 21 juil. 2004 à 20:28
bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004 - 22 juil. 2004 à 13:36
Bonjour,

En fait je voudrai pouvoir lancer une boucle while à l'aide d'un bouton 1 qui pourrait être stoppé à l'aide d'un bouton stop.
Il me faut cette boucle infinie car ce programme doit être relié à une chaine de production via les ports de l'ordinateur et le tout doit donc ce faire dans un cycle automatique (d'où ma boucle while infinie).
Je me suis reseigné sur les threads mais je vois pas comment dans le deuxième thread on peu accéder à l'évènement du bouton...
Si qqn peut me renseigner ou aurait une autre solution merci de m'aider.

Bertrand

12 réponses

3psilon Messages postés 76 Date d'inscription lundi 19 juillet 2004 Statut Membre Dernière intervention 17 janvier 2005
21 juil. 2004 à 21:04
lut

Ne pourrais tu pas faire avec 2 threads :

un qui fait la boucle et un qui commande le demarrage ou l'arret de la boucle ( du thread ) ?

Meme si apparement c de l'indus, ne peux-tu pas utiliser un timer ?

Bye

3psilon
0
bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004
21 juil. 2004 à 21:36
oué ben le deuxième thread c comme ça que je le vois moi aussi. Mais comment je fais pour détecter l'évènement du bouton à partir de ce deuxième thread? Si j'ai cette réponse je peux faire le code.
Merci pour l'aide.

Et sinon, comment tu vois ça avec un timer.

je vous explique vite fait le fct.

C un Système pour faire des mesures(controles)

Automate principale donne l'ordre a mon soft de faire la mesure (via port parallèle)
puis le soft fait une requete rs232 à l'appareil de mesure qui donne ensuite la mesure à mon soft.
fonctionnement en cycle que je veux tout de même pouvoir arrêter quand je le veux.

Bertrand
0
3psilon Messages postés 76 Date d'inscription lundi 19 juillet 2004 Statut Membre Dernière intervention 17 janvier 2005
21 juil. 2004 à 23:27
slt

Je deja répondu mais ca n'as pas été pris en compte :(, alors
je repost :)

je viens de tester et cela fonctionne tu peux tres bien lancer un thread puis l'arreter quand tu le desires.

genre :

DWORD dwThread; // id du thread
HANDLE hThread; // handle du thread

// LA BOUCLE INFINIE
DWORD WINAPI Infinity(LPVOID lpParameter) {
while(true){}
return 0;
}

void Startthread(){
hThread = CreateThread(NULL,0,&Infinity,NULL,NULL,&dwThread);
}
void Stopthread(){
TerminateThread (hThread,0); // 2e param a remplir pour la
} // gestion des erreurs

....
....
..//EVENEMENT CLICK BOUTON
case IDCSTART:
{
Startthread();
break;
}
case IDCSTOP:
{
Stopthread();
break;
}
default:break;
......
...
..

Finalement pas besoin de timer ;)

Bye

3psilon
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
21 juil. 2004 à 23:30
mets une variable:
int bstop;

avant chaque lancement du thread:
bstop = 0;

dans bouton bstop = 1;
tu verif a chaque tour de boucle bstop dans le thread.

ciao...
BruNews, Admin CS, MVP Visual C++
0

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

Posez votre question
bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004
22 juil. 2004 à 08:23
Tout dŽabord merci pour lŽaide.
si jŽai bien compris avec ce code on lance et on arrete la boucle infinie avec le meme bouton, c ca?
Je débute en c++....
Sinon jŽaimerai quŽon mŽéclaire sur IDCSTART et IDCSTOP.
Je vois pas trop dŽoù ca sort.

mon code ca va ressembler a ca alors?:

bool bstop=true;

DWORD dwThread; // id du thread
HANDLE hThread; // handle du thread

// LA BOUCLE INFINIE
DWORD WINAPI Infinity(LPVOID lpParameter) {
while(bstop){}
return 0;
}

void Startthread(){
hThread = CreateThread(NULL,0,&Infinity,NULL,NULL,&dwThread);
}
void Stopthread(){
TerminateThread (hThread,0); // 2e param a remplir pour la
} // gestion des erreurs

_fastcall void BoutonClick(....){ //je connais plus tro la syntaxe...
case IDCSTART:
{
Startthread();
break;
}
case IDCSTOP:
{
bstop=false;
Stopthread();
break;
}
default:break;
}

Merci si vous pouvez confirmez, jŽai pas BORLAND au boulot pour tester.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
22 juil. 2004 à 11:06
TerminateThread ne doit etre employe qu'en cas de blocage, c'est une instruction d'extreme urgence.
Regarde exemples dans les sources publiees, details complets dans Richter:
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

ciao...
BruNews, Admin CS, MVP Visual C++
0
3psilon Messages postés 76 Date d'inscription lundi 19 juillet 2004 Statut Membre Dernière intervention 17 janvier 2005
22 juil. 2004 à 12:01
Re tlm

En effet, je n'avais pas lu msdn jusqu'au bout ;) dsl

"
TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.
"

Mais alors, comment tu ferais brunews ?
Une condition ds le deuxieme thread pour etre sur de sortir de la boucle ou y a t il un autre moyen ?

bertrandbasch>
IDCSTART et IDCSTOP sont juste les noms que j'ai donné aux buttons

Merci

ps: Brunews, J'ai un grand respect pour le travail que tu fournis, felicitations, en plus tes persans sont magnifiques .... bonne continuation ;)

+++

3psilon
0
bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004
22 juil. 2004 à 12:11
---->3psilon

Je vois pas comment ca marchait ton truc alors.

Ce code:

case IDCSTART:
{
Startthread();
break;
}
case IDCSTOP:
{
Stopthread();
break;
}
default:break;

tu le places dans quelle fonction?

sinon je suis dáccord. Impressionant le boulot de Brunews
Je suis a des annees lumieres de ca.

Bon si vous avez une soluce qui soit "propre"...

Bertrand
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
22 juil. 2004 à 12:19
DWORD dwThread; // id du thread
HANDLE hThread; // handle du thread

case IDCSTART:
{
if(hThread) break; // thread deja en cours
bstop = 0;
Startthread();
break;
}
case IDCSTOP:
{
bstop = 1;
break;
}

Verif bstop dans boucle de ta func thread et sors proprement en retournant une valeur. Avanr sortie, PostMessage un (WM_USER + xxx) a la fenetre qui cree ce thread. A reception de ce message, fenetre ferme hthread (CloseHandle(hThread); hThread = 0;) et autres trucs suivant besoin.

ciao...
BruNews, Admin CS, MVP Visual C++
0
bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004
22 juil. 2004 à 13:09
Donc si jŽai bien compris g pas besoin de la fonction:

void __fastcall TForm2::IDCSTOPClick(TObject *Sender)

svp confirmez.... je suis un peux perdu. C pas trop de mon niveau les threads.

Merci pour votre aide.

Bertrand
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
22 juil. 2004 à 13:18
Moi je ne fais pas du tout de Borland, a toi de voir ce qu'il y a a mettre ou non comme code dans ce bouton.

bstop = 1;
break;
me semblait le code du clic pour stopper ton thread, ceci du point de vue prog directe par API.

ciao...
BruNews, Admin CS, MVP Visual C++
0
bertrandbasch Messages postés 22 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 12 août 2004
22 juil. 2004 à 13:36
ok merci.
Je crois avoir compris le principe. C deja ca. A moi de me debrouiller maintenant.
Si ca marche, je posterai le code final en Borland pour les personnes que ca interessera.

Bertrand
0