[VISUAL C++] Fermeture prématurée d'un thread

Fermeture prématurée d'un thread [VISUAL C++] - Programmation

Marsh Posté le 03-06-2001 à 19:08:16    

Bonjour,
 
Dans mon application, j'ai créé un thread lançant une opération pouvant durer très longtemps (plusieurs heures). L'ennui, c'est que j'aimerai insérer dans mon interface graphique un bouton "Annuler" permettant de stopper et détruire ce thread.
 
J'ai vu que l'utilisation de la procédure AfxEndThread() était possible. Mais il demande le code de sortie ("exitcode" ) de mon thread.
 
Comment le récupérer ?
 
Apparemment il faut utiliser "GetExitCodeThread()" pour récupérer la valeur de l'exitcode en lui passant comme paramètres le HANDLE du thread (que j'ai pu récupérer) ainsi que la variable dans laquelle sera copiée l'exitcode.
L'ennui c'est que je récupère un LPDWORD et qu'il me faut un UINT comme paramètre de AfxEndThread().
Comment faire ? (un cast ne fonctionne pas)
 
Quelqu'un pourrait me donner un exemple SVP ?
 
Merci d'avance :)

Reply

Marsh Posté le 03-06-2001 à 19:08:16   

Reply

Marsh Posté le 03-06-2001 à 21:07:18    

C'est toi qui décide ce que tu veux envoyer comme code de retour.
Il y a aussi ExitThred et TerminateThread.

Reply

Marsh Posté le 04-06-2001 à 01:06:53    

Ok !
 
Par contre à quel moment je décide de ce code ? :)

Reply

Marsh Posté le 04-06-2001 à 23:45:15    

Ce ne serait pas la valeur retournée par la fonction que je passe en paramètre de AfxBeginThread( ) ???

Reply

Marsh Posté le 05-06-2001 à 00:16:46    

SI ! :D

Reply

Marsh Posté le 05-06-2001 à 10:18:28    

Ca ne peut pas être possible ?
Etant donné que cette valeur est retournée quand la fonction a fini de s'exécuter, comment faire pour terminer le thread avant que cette fonction ne soit pas terminée ? puisque la valeur n'est pas encore retournée... :)

Reply

Marsh Posté le 05-06-2001 à 10:23:31    

guillot a écrit a écrit :

Ca ne peut pas être possible ?
Etant donné que cette valeur est retournée quand la fonction a fini de s'exécuter, comment faire pour terminer le thread avant que cette fonction ne soit pas terminée ? puisque la valeur n'est pas encore retournée... :)




 
justement, TU fixe la valeur de retour de cette fonction quand, dans ton thread, tu fait AfxEndThread(). Par exemple, si tu mets 1 en paramètre de AfxEndThread(), ta fonction AfxBeginThread() rendra 1.
C ça Verdoux !?

Reply

Marsh Posté le 05-06-2001 à 10:43:58    

Nan je pense pas... La fonction AfxBeginThread renvoie un pointeur sur un objet de type CWinThread, elle ne peut renvoyer un entier...

Reply

Marsh Posté le 05-06-2001 à 10:48:06    

Si je peux me permettre :
l'idee de finir un Thread "de l'exterieur" est en general une mauvaise idee.... qui se passe rarement bien et dont les consequences peuvent etre les plus inatendues....
 
En general ne veux pas dire toujours...
 
Ceci dit, je vous laisse debattre de la methode a utiliser n'etant pas tres competente en Windows est encore moins en MFC...

 

[edit]--Message édité par BENB--[/edit]

Reply

Marsh Posté le 05-06-2001 à 10:51:46    

A vrai dire, on m'a toujours déconseillé de faire ainsi !
Mais dans mon cas, je ne vois pas comment faire autrement.
 
En fait cette idée de terminer un thread prématurément est venue du fait que je souhaitais faire un client FTP en Visual C++ et que j'aurais aimé que l'utilisateur puisse annuler un téléchargement.
Mon téléchargement se fait dans un thread, et le seul moyen que je connaisse pour le stopper est de terminer le thread...
 
De plus, je souhaite faire de cette ménière pour des raisons de temps. Ce client FTP va être présenté en tant que projet à mon examen du BTS dans 2 semaines et j'en ai d'autres à terminer, c'est pour ça que j'aimerai finir cette dernière fonctionnalité :)

Reply

Marsh Posté le 05-06-2001 à 10:51:46   

Reply

Marsh Posté le 05-06-2001 à 11:02:48    

Ton thread peut vérifier régulièrement l'état d'une variable et agir selon cet état.
 
Sinon il y a la fonction TerminateThread:
http://msdn.microsoft.com/library/ [...] d_7h2c.htm
 
Mais MS avertit:
"TerminateThread is a dangerous function that should only be used in the most extreme cases."
 
"Warning  The TerminateThread and TerminateProcess functions should be used only in extreme circumstances, since they do not allow threads to clean up, do not notify attached DLLs, and do not free the initial stack. The following steps provide a better solution:
 
- Create an event object using the CreateEvent function.  
- Create the threads.  
- Each thread monitors the event state by calling the WaitForSingleObject function. Use a wait time-out interval of zero.  
- Each thread terminates its own execution when the event is set to the signaled state (WaitForSingleObject returns WAIT_OBJECT_0).  
"

 

[edit]--Message édité par Verdoux--[/edit]

Reply

Marsh Posté le 05-06-2001 à 11:05:48    

Merci beaucoup !
 
Je vais tenter de voir ça !
en fait je n'ai pas pu tester TerminateThread() vu qu'il demande le CD3 de la MSDN et je n'ai que le 1 et 2 :=)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed