2009-07-01 10 views
2

Je pense qu'il y a une réponse évidente à cela, mais ça m'a échappé. J'ai un code hérité en C++ ici qui casse quand il essaie d'appeler OpenThread(). Je l'exécute dans Visual C++ 2008 Express Edition. Le programme obtient d'abord le ThreadID du thread appelant, et tente de l'ouvrir, comme suit:OpenThread() Retourne NULL Win32

ThreadId threadId = IsThreaded()? thread_id: :: GetCurrentThreadId(); HANDLE threadHandle = OpenThread (THREAD_ALL_ACCESS, FALSE, ID_fichier)

Maintenant, voici ce que je ne comprends pas: si l'ID du thread est l'ID du thread actuel, n'est-il pas déjà ouvert? Serait-ce la raison pour laquelle il retourne NULL?

Tout commentaire serait apprécié.

Répondre

5

Peut-être que vous demandez trop d'accès (THREAD_ALL_ACCESS), même si je pense que vous auriez à peu près toutes les autorisations à votre propre thread. Essayez de réduire l'accès à ce dont vous avez vraiment besoin.

Que retourne GetLastError()?

Mise à jour:

Jetez un oeil à ce commentaire de MSDN:

Windows Server 2003 et Windows XP/2000: La taille du THREAD_ALL_ACCESS drapeau a augmenté sur Windows Server 2008 et Windows Vue. Si une application compilée pour Windows Server 2008 et Windows Vista est géré sur Windows Server 2003 ou Windows XP /2000, le drapeau THREAD_ALL_ACCESS est trop grande et la fonction spécifiant ce drapeau échoue avec ERROR_ACCESS_DENIED. Pour éviter ce problème, spécifiez l'ensemble minimum de droits d'accès requis pour l'opération . Si THREAD_ALL_ACCESS doit être , définissez _WIN32_WINNT sur le système d'exploitation minimum ciblé par votre application (par exemple, #define _WIN32_WINNT _WIN32_WINNT_WINXP). Pour plus d'informations, voir Utilisation de Windows En-têtes

+0

THREAD_ALL_ACCESS était apparemment le problème. J'ai utilisé THREAD_SET_INFORMATION et ça a fait l'affaire. Merci beaucoup! – RCC

0

Essayez d'utiliser _beginthreadex au lieu de OpenThread. Exemple:

HANDLE hThread; 
UINT uiThreadId = 0; 
hThread = (HANDLE)_beginthreadex(NULL, // Security attributes 
    0, // stack 
    &this->ThreadProc, // Thread proc 
    this, // Thread param 
    CREATE_SUSPENDED, // creation mode 
    &uiThreadId); // Thread ID 

if (hThread != NULL){ 
    //SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); 
    ResumeThread(hThread); 
    m_hThread = hThread; 
} 
else{ 
    eRetVal = err_ThreadStartErr; 
} 
+0

Cela ne commencerait-il pas un nouveau sujet? –

Questions connexes