2010-01-05 6 views
3

Je dois pouvoir suspendre et reprendre le thread principal dans une application Windows C++. Je l'ai utiliséSuspendre et reprendre le thread principal en C++ pour Windows

handle = GetCurrentThread(); 
SuspendThread(handle); 

et alors, où est devrait reprendre

ResumeThread(handle); 

tout en suspendant son fonctionnement, la reprise non. J'ai d'autres threads qui sont suspendus et repris sans problème, y at-il quelque chose qui est différent avec le fil principal.

J'ai fait beaucoup de threads en C# et en Java mais c'est la première fois que j'en ai fait en C++ et je trouve que c'est un peu différent.

+2

Le thread principal essaie de se suspendre et de se reprendre. Comment un thread peut-il se reprendre lorsqu'il est arrêté et ne peut pas exécuter l'appel ResumeThread. – rerun

+0

Non, il appelle SuspendThread lui-même, mais ResumeThread est appelé plus tard par un autre thread. En mode débogage, il affiche le nombre de suspensions sur le volet des threads, il augmente de 1 lorsque la fonction suspend est appelée mais ne baisse pas de un lorsque CV est appelé. –

+0

Est-ce que ResumeThread() renvoie une valeur négative, et si oui, que retourne GetLastError()? –

Répondre

12

Utilisez-vous la valeur « poignée » vous avez obtenu de GetCurrentThread() dans l'autre fil? Si oui, c'est une valeur de pseudo. Pour obtenir un handle de thread réel, utilisez DuplicateHandle ou essayez

 
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId());

+0

Merci, cela a fonctionné. –

2

Le moyen le plus simple d'obtenir le même résultat est de CreateEvent et d'avoir le fil principal WaitForSingleObject, puis de le réactiver avec SetEvent à partir d'un autre fil.

+0

N'oubliez pas que tant que le thread principal est suspendu ou attendu, la pompe de message ne sera pas pompée. Entre autres choses, le résultat le plus évident est que l'interface graphique ne répondra pas. –

+0

Ne pas suspendre le thread principal ont le même résultat? –

+0

N'est-ce pas ce que j'ai dit? :) –

6

GetCurrentThread renvoie un "pseudo-handle" qui ne peut être utilisé qu'à partir du thread appelant. Utilisez DuplicateHandle pour créer un handle réel qu'un autre thread peut utiliser pour reprendre le thread principal.

Voir http://msdn.microsoft.com/en-us/library/ms683182%28VS.85%29.aspx

+2

Dieu, j'aime Microsoft :) –

2

Et, voici un exemple qui montre ce que certaines personnes ont suggéré auparavant.

#include <stdio.h> 
#include <tchar.h> 
#include <windows.h> 
#include <process.h> 

HANDLE g_hMainThread; 
void TheThread(void *); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    g_hMainThread = OpenThread(THREAD_ALL_ACCESS, 
           FALSE, 
           GetCurrentThreadId()); 
    printf("Suspending main thread.\n"); 
    _beginthread(TheThread, 0, NULL); 
    SuspendThread(g_hMainThread); 
    printf("Main thread back in action.\n"); 
    return 0; 
} 

void TheThread(void *) 
{ 
    DWORD dwStatus = ResumeThread(g_hMainThread); 
    DWORD dwErr = GetLastError(); 
    printf("Resumed main thread - Status = 0x%X, GLE = 0x%X.\n", 
      dwStatus, 
      dwErr); 
} 
Questions connexes