Sortir d'une boucle while infinie avec un bouton

Messages postés
22
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
12 août 2004
- - Dernière réponse : 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
Afficher la suite 

12 réponses

Messages postés
76
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
17 janvier 2005
0
Merci
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
Commenter la réponse de 3psilon
Messages postés
22
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
12 août 2004
0
Merci
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
Commenter la réponse de bertrandbasch
Messages postés
76
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
17 janvier 2005
0
Merci
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
Commenter la réponse de 3psilon
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
22
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
12 août 2004
0
Merci
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.
Commenter la réponse de bertrandbasch
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
76
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
17 janvier 2005
0
Merci
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
Commenter la réponse de 3psilon
Messages postés
22
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
12 août 2004
0
Merci
---->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
Commenter la réponse de bertrandbasch
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
22
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
12 août 2004
0
Merci
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
Commenter la réponse de bertrandbasch
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
22
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
12 août 2004
0
Merci
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
Commenter la réponse de bertrandbasch