Creation d'un Thread en MFC et arret par un bouton

Signaler
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005
-
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005
-
Bonjour à tous,

Je cherche à créer un Tread tout simple :
fonction Thread du bouton Start
{
while (arret=false)
{

Sleep(1000) // on laisse 1 sec a l'utilisateur pour appuyer sur un bouton

Si on appuie sur le bouton STOP, arret=true et on sort de la boucle;
}

}

Voila, je pense que c'est pas très dur, j'ai fait quelques recherche, mais je n'ai pas trouvé comment arrêter un Thread quand on veut.

Merci d'avance pour m'aider .

DJ T.

9 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
mets une variable
int bstop = 0;
ton bouton: bstop = 1;

dans thread:
while(!bstop) {
.....
}
return 0;

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005

Ouai, je vois bien ce que tu veux dire. Mais le problème c'est que je ne sais pas trop comment déclarer un thread (je commence aujourd'hui à m'interesser au Thread !)

Et j'ai vu qu'il existe une section critique, mais je ne sais pas trop si ça pourrait servir.

Voici une partie de mon prog :

void CMenuSimulation::OnButtonExe()
{

CListBox* pListe=(CListBox*)GetDlgItem(IDC_LIST_SORTIE);

while (Arret==0)
{
...
pListe->InsertString(-1, " bla bla bla"); // je dois afficher dans une ListeBox
...
}

}

void CMenuSimulation::OnButtonStop()
{
Arret=1;
}

Si on pouvait m'aider à remplir mon prog pour déclarer le Thread, ça serait fantastic !!!
Merci d'avance pour votre aide

DJ T.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
En direct API serait ok pour t'aider mais MFC, tres peu pour moi.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005

OK BruNews, merci quand meme ;-)

DJ T.
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005

Bon, j'avance plutot bien. Mais il ne me reste plsu que de l'affichage à faire... (pourtant c le truc le + facile) mais j'ai une erreur : error C2660: 'GetDlgItem' : function does not take 1 parameters. Cette erreur vient de ma CListeBox*.

Voici le bout de prog :

DWORD WINAPI Thread_Test( LPVOID lpParam )
{

// hstatus = GetDlgItem(hdlg, IDC_LIST1);
do
{

Arret+=1;

CListBox* pListe=(CListBox*)GetDlgItem(IDC_LIST1);

Sleep(100L);

/*-- on boucle tant que l'on n'a pas recut d'événement stopper --*/
}while( WaitForSingleObject( d_eventStop, D_TIME_OUT_TEST ) == WAIT_TIMEOUT );

CloseHandle( d_eventStop );
d_eventStop = NULL;

return 0;
}

Voila, si quelqu'un pouvait m'aider, ça serait cool.
(en attendant, je vais continuer mes recherches...)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Faudrait que tu passes pointeur sur fenetre mere pour faire ton GetDlgItem dessus.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005

Ouai, je comprends ce qu'il faut faire. mais je ne vois pas comment le faire pointer. t'aurais pas une solution par hasard ?

merci BruNews
DJ T.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
passe pointeur de ta CDialog en param du thread.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
8
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
2 février 2005

Ok, j'ai déclaré un pointeur en param du thread : voici

DWORD WINAPI Thread_Test( LPVOID lpParam)
{

CESSAICPPDlg* pObject = (CESSAICPPDlg*)lpParam; // ça marche.

if ((pObject == NULL) || !pObject->IsKindOf(RUNTIME_CLASS (CESSAICPPDlg))) // ça marche pas.

return 1;

do
{

Arret+=1;
pObject->OnButtonAff();

Sleep(100L);

}while( WaitForSingleObject( d_eventStop, D_TIME_OUT_TEST ) == WAIT_TIMEOUT );

CloseHandle( d_eventStop );
d_eventStop = NULL;

return 0;
}

Je ne comprends pas pourkoi cette instruction " if ((pObject == NULL) || !pObject->IsKindOf(RUNTIME_CLASS (CESSAICPPDlg))) " ne marche pas ???

pourtant ma classe s'appelle bien CESSAICPPDlg.

et la fonction OnButtonAff() permet d'afficher la variable Arret

voila merci pour les tuyaux.

DJ T.