Creation de timer [Résolu]

julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 22 mars 2006 à 22:50 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 27 mars 2006 à 22:51
3
Merci
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de BruNews
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 22 mars 2006 à 23:02
0
Merci
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
Commenter la réponse de SAKingdom
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 23 mars 2006 à 01:20
0
Merci
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++
Commenter la réponse de BruNews
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 23 mars 2006 à 02:19
0
Merci
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
Commenter la réponse de SAKingdom
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 23 mars 2006 à 21:24
0
Merci
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++
Commenter la réponse de BruNews
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 24 mars 2006 à 20:32
0
Merci
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.
Commenter la réponse de julienbornet
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 24 mars 2006 à 20:33
0
Merci
A moins qu'il ne serve a allouer la memoire suffisant au derouleemnt du thread
Commenter la réponse de julienbornet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 24 mars 2006 à 20:44
0
Merci
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++
Commenter la réponse de BruNews
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 24 mars 2006 à 21:24
0
Merci
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;


}


}
Commenter la réponse de julienbornet
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 24 mars 2006 à 21:26
0
Merci
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
Commenter la réponse de julienbornet
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 24 mars 2006 à 21:34
0
Merci
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;


}


}
Commenter la réponse de julienbornet
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 24 mars 2006 à 21:44
0
Merci
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
Commenter la réponse de julienbornet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 24 mars 2006 à 21:53
0
Merci
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++
Commenter la réponse de BruNews
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 27 mars 2006 à 18:26
0
Merci
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;


}




}
Commenter la réponse de julienbornet
julienbornet 99 Messages postés jeudi 9 février 2006Date d'inscription 2 février 2009 Dernière intervention - 27 mars 2006 à 21:01
0
Merci
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
Commenter la réponse de julienbornet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.