2011-07-02 42 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/ –

相关问题