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

djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005 - 20 juin 2004 à 15:23
djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005 - 20 juin 2004 à 18:56
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

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

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

ciao...
BruNews, Admin CS, MVP Visual C++
0
djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005
20 juin 2004 à 16:11
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.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
20 juin 2004 à 16:15
En direct API serait ok pour t'aider mais MFC, tres peu pour moi.

ciao...
BruNews, Admin CS, MVP Visual C++
0
djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005
20 juin 2004 à 16:18
OK BruNews, merci quand meme ;-)

DJ T.
0

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

Posez votre question
djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005
20 juin 2004 à 16:54
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...)
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
20 juin 2004 à 17:16
Faudrait que tu passes pointeur sur fenetre mere pour faire ton GetDlgItem dessus.

ciao...
BruNews, Admin CS, MVP Visual C++
0
djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005
20 juin 2004 à 17:43
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.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
20 juin 2004 à 17:48
passe pointeur de ta CDialog en param du thread.

ciao...
BruNews, Admin CS, MVP Visual C++
0
djtiaf Messages postés 8 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 2 février 2005
20 juin 2004 à 18:56
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.
0