2017-01-01 105 views
1

我想创建一个应用程序WinAPI的/窗口,因为我不希望我的执行封锁,同时等待消息,我打算有2个线程;一个主线程和一个应用程序线程。应用程序线程会创建窗口(CreateWindowEx),然后阻塞在消息循环中。WinAPI的多线程应用程序

我的困境来自于想要修改应用程序的一部分的主线程。例如,更改样式,大小等。为了让应用程序保持线程安全,我会假设最好将这种代码保留在同一个线程中。我的第一个想法是从主线程发布消息,以便应用程序线程解除阻塞并可以处理该请求,然后再次阻止。但是,我不确定是否从一个单独的线程发送消息是安全的,而且我很难在线查找答案。也许还有更好的解决方案,我不考虑。我将不胜感激任何帮助或反馈。

+1

这个任务,你不需要有2个(或多个线程) - 单线程绰绰有余。使用'MsgWaitForMultipleObjectsEx'基础消息循环 – RbMm

+2

是的,您可以在线程之间发布(或发送)消息。 –

回答

2

发送消息与SendMessage和/或PostMessage跨线程是安全的和支持。

SendMessage函数等待,而其他线程处理消息PostMessage的不等待。有两个,但在你的情况需要记住的重要事情之间的其他区别是,你不能做

... 
if (whatever) 
{ 
    char buffer[100]; 
    strcpy(buffer, "hello world"); 
    PostMessage(g_MyWindow, WM_APP, 0, (LPARAM) buffer); // BUG, must use SendMessage 
} 
... 

因为缓冲区可能超出范围的其他线程处理的消息之前。

一般来说,处理诸如MoveWindowGetWindowRect之类的窗口的所有Windows函数都是线程安全的。他们中的大多数也可以在Windows上的另一个进程使用...

+0

有几点需要注意:'1'尽管技术上线程安全,但应始终从创建窗口的线程调用窗口增变器。例如,为[DestroyWindow](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682.aspx)明确阐述了这一点。 '2'应该使用'SendMessageTimeout'完成跨线程发送消息以防止死锁。 '3'虽然'SendMessage'正在等待目标返回,它仍然会派发入站的跨线程消息。 – IInspectable

+0

@IInspectable是SendMessage函数给其他线程是有风险的,如果目标不处理的消息,但你一般只针对它后卫与其他进程打交道时,你只需承担自己的代码是免费的bug;)从一个工作线程发送消息的UI线程不应该是一个问题。 – Anders

+0

仅仅因为一个线程在你的过程中运行并不意味着它是你的代码。 – IInspectable