2011-07-02 43 views
1

我使用TinyThread ++構建了自己的線程庫。它工作得很好,對我來說這也是一個很好的學習經驗。我有自己的數據結構來傳遞消息,界面對我來說很有意義,主要是因爲我是它的作者。與pthreads一起使用Win32 API功能

每當在我的系統中創建一個線程時,它會在一個循環中運行,並通過我自己設計的消息傳遞協議偶爾檢查消息。

現在我想開始使用一些Windows API功能,並且Windows有自己的一套約定和消息隊列等。現在我很確定TinyThread ++使用pthreads。由於我使用MinGW,我想知道是否在Windows線程上實現了pthread。如果是這種情況,我可能會將我的pthreads線程視爲windows線程。但如果不是,我懷疑我可能會遇到一些奇怪的行爲。

編輯:查看由Tinythread給出的thread類型++,它看起來像它實際上使用了Windows HANDLE跟蹤線程,甚至使用_beginthreadex產卵他們。

我的問題是,如果我從我的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

這應該沒問題。

如果您嘗試將pthread線程ID傳遞給需要線程句柄的Windows線程函數,您可能會遇到麻煩,但在此您只需要循環與SetWindowsHookEx保持同一線程。

0

除非你使用類似cygwin的東西,否則Pthreads不存在於Windows上。無論採用哪種方式,API文檔都會說SetWindowsHookEx將與特定線程綁定的應用程序事件掛鉤關聯起來,或者將應用程序事件綁定到運行應用程序的桌面上。因此它可以處理在線程中被調用,但是您需要閱讀文檔,以便您以一種可以給予您想要的行爲的方式進行調用。

+1

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

相關問題