Dans une applie Win32, je dois appeler une fonction search() qui peut
prendre une 30taine de secondes et qui contient une boucle infinie stoppée
par une variable globale. Si j'appelle cette fonction search() tel quel,
toute l'appli est gelée et ne répond plus. J'utilise alors :
DWORD thread1;
hThread1=CreateThread(
NULL, // pointer to thread security attributes
0, // initial thread stack size, in bytes
(unsigned long (__stdcall *)(void *))search,
NULL, // argument for new thread
0, // creation flags
&thread1 // pointer to returned thread identifier
);
Mais dans ce cas, il semble que la variable globale censée stopper la
recherche n'ait plus d'effet. Je suppose que le thread est un processus
parallèle et qui démarre avec une copie de cette variable globale. Comment
stopper la recherche avec cette variable globale ?
L'autre problème, qui doit être identique est que si je clique sur la croix
pour fermer la fenêtre pendant une recherche, l'appli quitte seulement quand
le thread est terminé.
"Michaël Cortex" escribió en el mensaje news:WuJ4b.46890 | D'ailleurs, quelle est la différence entre ces deux conventions d'appel ?
Importantes :
- la plus importante est que la convention C empile les paramètres de gauche à droite (ce qui permet de gérer les déclarations à nombre de paramètres variables .. printf, etc ... , même si ces derniéres perdent beaucoup d'interêt avec le C++) et le __sdtcall (convention "Pascal" valide aussi pour le PLM, ente autre - l'Algol aussi je crois) à l'envers
- le "nettoyage" de la pile au retour est effectué par l'appelant avec laconvention C, par l'appelé avec la convention pascal
- la décoration des noms est différentes (mais pas normalisée pour le C, qui, de plus, diffère sur ce point du C++)
Il y a peut être d'autres points de détails mais je ne les ai pas en tête.
Pour regarder de prés, compile toi un bout de code incluant 2 appels, (un de chaque) et regarde l'assembleur généré
François
"Michaël Cortex" <cort@meloo.com> escribió en el mensaje news:WuJ4b.46890
| D'ailleurs, quelle est la différence entre ces deux conventions d'appel ?
Importantes :
- la plus importante est que la convention C empile les paramètres de
gauche à droite (ce qui permet de gérer les déclarations à nombre de
paramètres variables .. printf, etc ... , même si ces derniéres perdent
beaucoup d'interêt avec le C++) et le __sdtcall (convention "Pascal" valide
aussi pour le PLM, ente autre - l'Algol aussi je crois) à l'envers
- le "nettoyage" de la pile au retour est effectué par l'appelant avec
laconvention C, par l'appelé avec la convention pascal
- la décoration des noms est différentes (mais pas normalisée pour le C,
qui, de plus, diffère sur ce point du C++)
Il y a peut être d'autres points de détails mais je ne les ai pas en tête.
Pour regarder de prés, compile toi un bout de code incluant 2 appels, (un de
chaque) et regarde l'assembleur généré
"Michaël Cortex" escribió en el mensaje news:WuJ4b.46890 | D'ailleurs, quelle est la différence entre ces deux conventions d'appel ?
Importantes :
- la plus importante est que la convention C empile les paramètres de gauche à droite (ce qui permet de gérer les déclarations à nombre de paramètres variables .. printf, etc ... , même si ces derniéres perdent beaucoup d'interêt avec le C++) et le __sdtcall (convention "Pascal" valide aussi pour le PLM, ente autre - l'Algol aussi je crois) à l'envers
- le "nettoyage" de la pile au retour est effectué par l'appelant avec laconvention C, par l'appelé avec la convention pascal
- la décoration des noms est différentes (mais pas normalisée pour le C, qui, de plus, diffère sur ce point du C++)
Il y a peut être d'autres points de détails mais je ne les ai pas en tête.
Pour regarder de prés, compile toi un bout de code incluant 2 appels, (un de chaque) et regarde l'assembleur généré
François
cbestern
pour cela il existe une méthode tres simple, ce sont les évenements: déclaration: HANDLE HandTread=NULL;
lors de l'appel du thread: HandEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
dans ton thread au lieu d'une boucle sans fin: while(WaitForSingleObject(HandEvente,0)!=WAIT_OBJECT_0)
pour l'arrêter: SetEvent(HandEvent); WaitForSingleObject(HandEvent,INFINITE); CloseHandle(HandEvent);
voila ce qui selon moi est le + propre pour les thread Cbestern.
pour cela il existe une méthode tres simple, ce sont les évenements:
déclaration:
HANDLE HandTread=NULL;
lors de l'appel du thread:
HandEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
dans ton thread au lieu d'une boucle sans fin:
while(WaitForSingleObject(HandEvente,0)!=WAIT_OBJECT_0)
pour l'arrêter:
SetEvent(HandEvent);
WaitForSingleObject(HandEvent,INFINITE);
CloseHandle(HandEvent);
voila ce qui selon moi est le + propre pour les thread
Cbestern.