2011-07-02 14 views
1

TinyThread ++を使用して独自のスレッドライブラリを構築しました。それはかなりうまくいっていて、私にとっても素晴らしい学習体験でした。私はメッセージを回すための独自のデータ構造を持っていますが、主に私が作者であったため、インターフェースは私にとっては意味があります。pthreadsと一緒に/からWin32 API機能を使用する

私のシステムでスレッドが作成されるたびに、それはループで実行され、時には自分の設計のメッセージ通過プロトコルによってメッセージをチェックします。

ここで、いくつかのWindows API機能を使い始めたいと思います。ウィンドウには独自の慣習やメッセージキューなどがあります。今ではTinyThread ++がpthreadsを使用していることは間違いありません。 MinGWを使用しているので、pthreadがWindowsスレッドに実装されているのだろうかと思います。この場合、私はpthreads-threadsをwindows-threadとして扱うことができるかもしれません。しかし、そうでない場合、私はいくつかの奇妙な行動に遭遇するかもしれないと思う。

編集:は、それが実際にスレッドを追跡するために窓HANDLEを使用しても、それらを起動するために_beginthreadexを使用するように見えるTinythreadで与えthreadタイプ++を見て。

私のpthreadsコードのいくつかの点からSetWindowsHookExを呼び出すと、私の質問は、Windowsがうれしいですか?私は同じスレッドでWindowsのメッセージポーリングループを持つ必要があることを理解しています。私はこのような何かをしようとしています:

try { 

    HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, 
     NULL, 0); 
    if (mousehook == NULL) printf("Mousehook error %u\n",GetLastError()); 

    while(true) { 
     MSG msg; 
     if (GetMessage(&msg,0,0,0)) { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    UnhookWindowsHookEx(mousehook); 

    printf("Procedure completed without exceptional events.\n"); 

} catch (...) { 
    printf("Exception!\n"); 
} 
+0

あなたは 'while'ループを終了することは決してありません。 – GSerg

+0

あなたは正しいです。私はまだ私がどのようにクリーンアップを処理するかもしれないかを理解していません。 –

+0

@GSerg、 'GetMessage'は' WM_QUIT'を受け取ったときに0を返すので、私はその時点でwhileループから抜け出すべきでしょうか? –

答えて

2

それはうまくいくはずです。

スレッドハンドルを必要とするWindowsスレッド関数にpthreadスレッドIDを渡そうとすると、問題が発生することがありますが、ここでループを使用すると、SetWindowsHookExという同じスレッドに留まる必要があります。

0

cygwinのようなものを使用していない限り、Pthreadはウィンドウに存在しません。どちらの方法でも、APIドキュメントは、SetWindowsHookExが、特定のスレッドに結び付けられたアプリケーションイベントのフックを、またはアプリケーションが実行されているデスクトップに関連付けると言う。だからスレッドで呼び出されることを扱うことができますが、あなたが望むような方法で呼び出せるように、ドキュメントを読む必要があります。

+1

http://sourceware.org/pthreads-win32/ –

関連する問題