Creation de timer

Résolu
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009 - 22 mars 2006 à 22:50
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 mars 2006 à 22:51
Bonjour j'ai besoin de creer un timer qui verifie l'etat d'un bouton (s'il a ete cliquer ou non) pendant qu'une autre action s'effectue.
Pourr etre plus clair, j'ai deux boutons, l'un sert au demarage d'une boucle while et l'autre est senser servir a stoper la boucle. Le probleme c'est que qd la boucle while s'effectue, je ne peut plus appuyer sur l'autre bouton. Il faut donc que j'effectue un test dans ma boucle while a interval regulier pour verifier que le bouton stop n'est pas ete clique.
Quelqu'un pourait il m'indiquer comment creer un tel timer

D'avance merci.

PS: je sais que la creation d'un mulitithread serait mieux mais aussi plus compliquer cependant si vous pouvez me dire exactement comment creer un thread qui demarre au clic du premier bouton et qui s'arret au clic du second je ne suis pas contre.

15 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2006 à 22:51
Rassemble tout ainsi:

DWORD WINAPI ThreadProc(LPVOID pparam)
{
int i = 0;
fic = fopen("testthread.txt","w+");
if(fic == NULL) goto Endthread;
EnableWindow(hbtstop, 1); // Rend le bouton stop actif
deb:
i++;
fprintf(fic,"%i\n",i);
if(!bstop) goto deb; // ETERNELLEMENT ???
fclose(fic);
Endthread:
PostMessage((HWND) pparam, WM_ENDTHRD, 0, 0);
return 0;
}

Ecriture et lecture de fichier, il y en a plein mes sources et c'est hyper simple:
DWORD d;
d = 0; // POUR CONTROLE ULTERIEUR
ReadFile(hfl, ptrData, nbrOctetsAlire, &d, 0);
Suffit de regarder dans d combien il y a eu d'octets de placés à l'adresse de ptrData.
WriteFile fonctionne exactement sur ce modèle.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
22 mars 2006 à 23:02
Tu peut pas faire un bouton pour une while. Dans ce cas il faut créé un nouveau thread avec CreateThread.
exemple

unsigned _thread1 (LPVOID param)
{
int i= NULL;

while(1)
{
i++;
}
}

met en variable global
HANDLE thread1

puis dans ta procédure de fenetre

case WM_COMMAND
if((HWND)lParam == ActivWhile)
thread1 = CreateThread(0, 0xFF, (LPTHREAD_START_ROUTINE)_thread1, 0, 0, 0);

if((HWND)lParam == StopWhile)
CloseHandle(thread1);

j'ai pas essailler alors jpeut pas te dire si c'est sûre

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2006 à 01:20
CloseHandle n'arrete pas un thread, ce serait:
TerminateThread() : méthode sauvage, cas d'extrème urgence.
ExitThread() : un peu plus propre mais encore bof bof.
Indiquer au thread de sortir proprement, exemple en positionnant un indicateur que le thread lira régulièrement sinon en utilisant les méthodes de synchro du système (lire Richter, le sujet est très vaste).

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
23 mars 2006 à 02:19
Ceci pour quitter "proprement" pourrait-il faire l'affaire alors?

unsigned _thread1 (LPVOID param)
{
int i= NULL;

while(1)
{
i++;

if(ThreadExit == true)
{
TreadExit = false;
break;
}
}

return 0;
}

met en variable global
HANDLE thread1;
bool ThreadExit = false;

puis dans ta procédure de fenetre

case WM_COMMAND
if((HWND)lParam == ActivWhile)
thread1 = CreateThread(0, 0xFF, (LPTHREAD_START_ROUTINE)_thread1, 0, 0, 0);

if((HWND)lParam == StopWhile)
ThreadExit = true;

___________________________________________
Les plus grands esprits trouvent toujours une solution
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2006 à 21:24
Exemple parmi d'autres ici:
TROUVER UNE CHAINE DE CARACTÈRES(2) (WIN32)
http://www.cppfrance.com/code.aspx?id=19169

Penser à fermer le handle: CloseHandle(thread1);

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
24 mars 2006 à 20:32
Ok Brunews je suis en traint d'essayer de ramanier la source que tu m'a filer pour faire quelque chose de propre (ou au moins essayer).
Par contre je ne sait pas a koi sert le type
LPDWD pdwd

il est present dans la Le thread et sert a pperement a afire le lien avec les autres fonctions.
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
24 mars 2006 à 20:33
A moins qu'il ne serve a allouer la memoire suffisant au derouleemnt du thread
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mars 2006 à 20:44
Le param du thread ? Il est défini par l'API, on passe ce qu'on veut via un pointeur.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
24 mars 2006 à 21:24
Oui merci je en effet je n'avait pas vu.
Bon voila j'ai terminer mon programme test qui me permet de verifier que j'ai bien compris ou non .

Je la poste donc si tu peux y jeter un coup d'oiel se serait sympa. Je penses partir sur cette base pour mon Thread pour mon prog principal. Ce thread se contente d'ecrire des nombre dams un fichier et il s'arret quand on pres le bouton stop (ce qui est en fin de compte prof de ce que je veux faire).


#include "Display.h"


/*-------------------------------------------------------------------------------------------*/


#define ONEMEGA 0x100000


#define WM_ENDTHRD (WM_USER+1)


HANDLE hthrd = 0;


HWND hbtstop;


DWORD bstop;


FILE * fic;


typedef
struct tagDWD {


WIN32_FIND_DATA wfd;



char *pmem;


}DWD, *LPDWD;


/*-------------------------------------------------------------------------------------------*/


void
__stdcall WriteInFile(LPDWD pdwd)


{



int i = 0;


deb:



if(bstop)
goto userstop;


i++;


fprintf(fic,"%i\n",i);



goto deb;


userstop:


fclose(fic);


}


DWORD WINAPI ThreadProc(LPVOID pparam)


{


LPDWD pdwd;
// 1 SEULE ALLOCATION, structure et pdwd->pmem


pdwd = (LPDWD) HeapAlloc(GetProcessHeap(), 0,
sizeof(DWD) + ONEMEGA);



if(!pdwd)
goto thrdExit;


pdwd->pmem = (
char*) (((BYTE*)pdwd) +
sizeof(DWD));


EnableWindow(hbtstop, 1);
// Rends le boutton stop actif



/*Allpeler la fonction du thread a cet endroit*/


WriteInFile(pdwd);


HeapFree(GetProcessHeap(), 0, pdwd);


thrdExit:


PostMessage((HWND) pparam, WM_ENDTHRD, 0, (LPARAM) pdwd);



return 0;


}


LRESULT CALLBACK MainProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)


{



int Select;



switch (Msg)


{



/*Initialisation of the windows */



case WM_INITDIALOG:


hbtstop = GetDlgItem(hDlg, IDC_BUTTON_StopThread);



return TRUE;



/* Programation of the management of the windows*/



case WM_COMMAND:


Select = LOWORD(wParam);



switch (Select)


{



case IDOK:


sortie = 0;


EndDialog(hDlg, LOWORD(wParam));



return TRUE;



case IDCANCEL:


sortie = 0;

EndDialog(hDlg, LOWORD(wParam));



return TRUE;



case IDC_BUTTON_StartThread:



if(hthrd)
return 0;


fic = fopen("testthread.txt","w+");


bstop = 0;


hthrd = CreateThread(0, 0, ThreadProc, (LPVOID) hDlg, 0, 0);



return TRUE;



case IDC_BUTTON_StopThread:


bstop = 1;



return TRUE;


}



default:
return FALSE;


}


}
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
24 mars 2006 à 21:26
Voila surtout n'hesite pas a me dire tout ce qui ne va pas. Une fois ces erreurs corriger penses tu (en tant qu'adiministarteur) qu'il serait interessant que je poset mon code.

D'avance merci
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
24 mars 2006 à 21:34
Desole en fait suite a ton message sur le lparam je n'ai pas tilter et en fait je crois bien qu'ici il est inutile. Voici donc ma source revu. Et je crois que j'ai oublier de suppirmer le thread mais je ne suis pas sur.


#include "Display.h"


/*-------------------------------------------------------------------------------------------*/


#define WM_ENDTHRD (WM_USER+1)


HANDLE hthrd = 0;


HWND hbtstop;


DWORD bstop;


FILE * fic;


int fileopen = 0;


/*-------------------------------------------------------------------------------------------*/


void
__stdcall WriteInFile()


{



int i = 0;


deb:



if(bstop)
goto userstop;


i++;


fprintf(fic,"%i\n",i);



goto deb;


userstop:


fclose(fic);


fileopen = 0;


}


DWORD WINAPI ThreadProc(LPVOID pparam)


{


EnableWindow(hbtstop, 1);
// Rends le boutton stop actif



/*Allpeler la fonction du thread a cet endroit*/


WriteInFile();


thrdExit:


PostMessage((HWND) pparam, WM_ENDTHRD, 0, 0);



return 0;


}


LRESULT CALLBACK MainProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)


{



int Select;



switch (Msg)


{



/*Initialisation of the windows */



case WM_INITDIALOG:


hbtstop = GetDlgItem(hDlg, IDC_BUTTON_StopThread);



return TRUE;



/* Programation of the management of the windows*/



case WM_COMMAND:


Select = LOWORD(wParam);



switch (Select)


{



case IDOK:


sortie = 0;


EndDialog(hDlg, LOWORD(wParam));



return TRUE;



case IDCANCEL:


sortie = 0;


EndDialog(hDlg, LOWORD(wParam));



return TRUE;



case IDC_BUTTON_StartThread:



if(hthrd)
return 0;


fic = fopen("testthread.txt","w+");


bstop = 0;


hthrd = CreateThread(0, 0, ThreadProc, (LPVOID) hDlg, 0, 0);



return TRUE;



case IDC_BUTTON_StopThread:


bstop = 1;



return TRUE;


}



default:
return FALSE;


}


}
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
24 mars 2006 à 21:44
je crois que j'ai oublier ca



case WM_ENDTHRD:


CloseHandle(hthrd); hthrd = 0;

dans le Switch(mssg)

et ca


if(hthrd) TerminateThread(hthrd, 0); pour la IDOK et le IDCANCEL
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mars 2006 à 21:53
bstop = 0; Quand le thread le regarde ?
Event button doit retourner 0.
Faut coder cohérent, tout API avec FILE* tout d'un coup au milieu, ça fait bizzare.
Le fichier devrait être ouvert et fermé par le thread s'il n'y a que lui qui s'en sert.
TerminateThread est réservé aux cas d'extreme urgence, tache de faire sortir le thread proprement (bstop = 0; et WaitForSingleObject() derrière).

Peut-etre pas utile de poser en source ce qui restera somme toute un exercice perso.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
27 mars 2006 à 18:26
Salut BruNews alors deja je teins a te remercier pour tes remarques toujourd aussi constuctives. Alors voial j'ai retravailler mon code en essayant de suivre au mieux toutes tes remarques. Cependant je doit te prevenir que je n'ai pas changer le point suivant:

"Faut coder cohérent, tout API avec FILE* tout d'un coup au milieu, ça fait bizzare."

Je sais que ma facon de code et loin d'etre academique et que je fais pas mal de connerie et de truc biazare mais c'est aussi [arce que j'apprends sur le tas. Ben oui tu sais je n'ai pas eu la chance de suivre des cours de c++ et donc par consequent j'essaye de me debrouiller tant bien que mal. Hors je sais qu'il existe les fonction createfile, writefile et read file pour creer et ecrie et liredans les fichiers par contre il faut que j'apprenne a m'en servir et si j'ai pu trouver de la doc sur create file ben il n'en est pas de meme pour writefile et readfile et donc en attendant mieux je fait avec les moyens du bord.

Bon je te joint ma nouvelle source, si tu peux y jeter un oeil pour verifier qu'il n'y a pas de grsosse connerie. D'avance merci


#include "Display.h"


/*-------------------------------------------------------------------------------------------*/





#define WM_ENDTHRD (WM_USER+1)


HANDLE hthrd = 0;


HWND hbtstop;


DWORD bstop;


DWORD dwEndthread = 1000;


FILE * fic;


//int fileopen = 0;





/*-------------------------------------------------------------------------------------------*/


void
__stdcall WriteInFile()


{



int i = 0;


deb:



if (bstop)
goto userstop;


i++;


fprintf(fic,"%i\n",i);



goto deb;


userstop:;


}


DWORD WINAPI ThreadProc(LPVOID pparam)


{


fic = fopen("testthread.txt","w+");


EnableWindow(hbtstop, 1);
// Rends le boutton stop actif





if (bstop)
goto Endthread;



/*Allpeler la fonction du thread a cet endroit*/


WriteInFile();


Endthread:


fclose(fic);


PostMessage((HWND) pparam, WM_ENDTHRD, 0, 0);



return 0;


}











LRESULT CALLBACK MainProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)


{



int Select;



switch (Msg)


{



/*Initialisation of the windows */



case WM_INITDIALOG:


hbtstop = GetDlgItem(hDlg, IDC_BUTTON_StopThread);



return TRUE;



case WM_ENDTHRD:


bstop = 0;


WaitForSingleObject(hthrd,dwEndthread);


CloseHandle(hthrd);


hthrd = 0;




return TRUE;

/* Programation of the management of the windows*/



case WM_COMMAND:


Select = LOWORD(wParam);



switch (Select)


{



case IDOK:


sortie = 0;



if(hthrd)


{


bstop = 0;


WaitForSingleObject(hthrd,dwEndthread);


}


EndDialog(hDlg, LOWORD(wParam));



return 0;



case IDCANCEL:


sortie = 0;



if(hthrd)


{


bstop = 0;


WaitForSingleObject(hthrd,dwEndthread);


}


EndDialog(hDlg, LOWORD(wParam));



return 0;



case IDC_BUTTON_StartThread:



if(hthrd)
return 0;


bstop = 0;


hthrd = CreateThread(0, 0, ThreadProc, (LPVOID) hDlg, 0, 0);



return 0;



case IDC_BUTTON_StopThread:


bstop = 1;



return 0;


}



default:
return FALSE;


}




}
0
julienbornet Messages postés 99 Date d'inscription jeudi 9 février 2006 Statut Membre Dernière intervention 2 février 2009
27 mars 2006 à 21:01
Euh Brunwws, juste un truc qui n'a pas reellement de rppart avec ca mais pourraiy tu me dire ou je peux trouver ta source de comparaison flux/win32 car cela m'interesse, mon programme devant ecrire les donnes rapidement dans le fichiers. D'avance merci
0
Rejoignez-nous