2009-07-01 4 views
2

明らかな答えがあるように感じますが、それは私を逃れています。 OpenThread()を呼び出そうとするときに壊れてしまうC++のコードがあります。 Visual C++ 2008 Express Editionで実行しています。プログラムはまず、呼び出し元のスレッドのThreadIDを取得し、それを開こうとします。OpenThread()はNULL Win32を返す

ThreadId threadId = IsThreaded()? thread_id :: GetCurrentThreadId();

HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS、FALSE、threadId);

ここで私は理解していないことがあります:スレッドIDが現在のスレッドのIDであれば、まだ開いていませんか?それがなぜNULLを返すのでしょうか?

フィードバックは高く評価されます。

答えて

5

アクセスが多すぎる(THREAD_ALL_ACCESS)と思っているかもしれませんが、自分のスレッドにすべてのアクセス権があると思います。本当に必要なものへのアクセスを減らしてください。

GetLastError()は何を返しますか?

更新:

は、MSDNからこのコメントを見てみましょう:

Windows Server 2003およびWindows XP/2000: THREAD_ALL_ACCESS旗の大きさは、 Windows Server 2008およびWindows上で増加しましたVista。 のWindows Server 2008とWindows Vistaのためにコンパイルされたアプリケーションは、Windows Server 2003またはWindows XP/2000上で を実行している場合は、THREAD_ALL_ACCESSフラグが 大きすぎると、このフラグが ERROR_ACCESS_DENIEDで失敗 を指定する機能です。この問題を回避するには、 操作に必要なアクセス権の最小値を と指定してください。 THREAD_ALL_ACCESSを にする必要がある場合は、アプリケーション の対象となる最小オペレーティングシステムの に_WIN32_WINNTを設定してください(たとえば、 #define _WIN32_WINNT _WIN32_WINNT_WINXP)。詳細については、Windowsの使用 ヘッダー

+0

明らかに問題がありました。私はTHREAD_SET_INFORMATIONを使用し、それはトリックでした。どうもありがとう! – RCC

0

OpenThreadではなく_beginthreadexを使用してください。 例:

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

新しいスレッドを開始しませんか? –