Thread "permanent"

Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 - 11 nov. 2004 à 15:09
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 - 11 nov. 2004 à 17:46
salut,
je cherche à effectuer un traitement par thread.
le traitement effectué par le thread doit se faire sans arret depuis son lancement jusqu'a une demande d'arret.
quelle est donc la méthode à employer sachant que le but est d'économiser le plus possible les ressources systemes?

1-un thread qui boucle avec à chaque iteration une verification sur un event signalant qu'il faut s'arreter?
bien sur dans le thread je me un Sleep(100) pour ne prendre qu'un echantillon par 10ms et eviter une occupation des ressources maximale.

2-une boucle qui appelle le thread tant qu'on en a besoin (le thread ne fait qu'une iteration puis se ferme, il est ensuite reouvert a iteration suivante)

3-une autre methode... peut etre que l'on peut arreter un thread sur un msg particulier, mais cela revient un peu à la solution 1. surtout que j'ai lu qu'il ne fallait ps detruire les thread à la sauvage...

ps: le traitement effectué par le thread est une capture d'image qui est copiée en Ram et envoyée à un autre module.

8 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 nov. 2004 à 15:56
Sans hésitation je prendrais la première solution, avec une variable globale BOOL qu'on met a FALSE quand on doit arrêter le thread
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
11 nov. 2004 à 16:02
moi j'utiliserais un event...Bocou mieux kun booléen ki pompe ttes les ressources...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2004 à 16:22
AlexMAN > pas compris ta remarque. La verif a chaque tour si reprendre ou sortie ne bouffe rien, non ?

ciao...
BruNews, MVP VC++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
11 nov. 2004 à 16:50
Dis moi si jme trompe, regarde ce bout de code (ki montre ce ke vecchio veut faire, l'histoire du booléen), jviens de tester et l'utilisation du processeur est de 98% :

BOOL b = 0;

/*-- programme --*/
DWORD WINAPI Thread_Test( LPVOID lpParam )
{
int inc=0;
char *szbuff;

szbuff = (char *)malloc(4);
if (!szbuff)
return 1;

do
{
inc++;
szbuff = itoa(inc, szbuff, 10);
SetWindowText(hstatus, szbuff);
}while( !b );

free(szbuff);

MessageBox(NULL, "Arret du thread.", "Stop", 0x40);
return 0;
}

BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_INITDIALOG:
SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(0, IDI_APPLICATION));
hstatus = GetDlgItem(hdlg, IDC_STATUS);
return 1;
case WM_COMMAND:
switch(wParam) {
case IDC_START:
/*-- création de l'évenenment indiquant que l'on souhaite arrêter le thread --*/
/*-- on créer le thread --*/
CreateThread(NULL, 0, &Thread_Test, NULL,NULL, &Thread_TestID);
return 0;
case IDC_STOP:
/*-- on génère un event --*/
b = 1;
return 0;
case IDCANCEL: EndDialog(hdlg, 0);
}
}
return 0;
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, PSTR, int)
{
DialogBoxParam(hinst, (LPCTSTR)IDD_APP, 0, AppDlgProc, 0);
return 0;
}

Dites moi si jme trompe...

++

PS : vecchio vient de me parler de Sleep, mais je trouve ca plutot moche...
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 nov. 2004 à 16:50
C'est WaitForSingleObject qui fait perdre du temps
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
11 nov. 2004 à 16:55
Mais des fonctions de synchro sont presentes, pkoi ne pas les utiliser ?

Brunews, si tu pouvais nous expliker kel est la meilleure solution, et si tu ne va pas dans mon sens, pkoi ? en koi les fonctions de synchro ne sont pas les 'meilleurs' ?

Merci et dsl si j'ai dit une betise..

++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2004 à 16:56
La question etait avec un: Sleep(100) et on verifie le BOOL seulement derriere.
Pour une super gestion faudra SuspendThread(), ResumeThread() avec synchro impec.

ciao...
BruNews, MVP VC++
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
11 nov. 2004 à 17:46
merci pour vos reponses...

j'avais dans l'idee d'utiliser un msg avec peekmsg qui ferait une verif tte les 10 itérations par exple, mais ca me semble un peu bourrin.

ou alors un event qui met à jour la condition de la boucle du thread et declenche donc l'arret de celui ci...

dans tt les cas on est d'accord pour dire qu'il est mauvais de lancer le thread à chaque itération plutot que d'inséerer la boucle dans le thread.

j'ai bien compris?

merci encore
0
Rejoignez-nous