Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinAPI-具有自己回调的消息循环_C++_C_Winapi - Fatal编程技术网

C++ WinAPI-具有自己回调的消息循环

C++ WinAPI-具有自己回调的消息循环,c++,c,winapi,C++,C,Winapi,通常的WinAPI消息循环如下所示: MSG msg; while (GetMessage(&msg, hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 是否允许不调用DispatchMessage(),而是自己处理消息?如果不是,我如何在避免全局变量和线程问题的同时很好地处理这种行为 编辑: 我基本上想使用我自己的回调函数,它没有WndProc签名。但是如果不使用静态或全局变量,我想

通常的WinAPI消息循环如下所示:

MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
是否允许不调用DispatchMessage(),而是自己处理消息?如果不是,我如何在避免全局变量和线程问题的同时很好地处理这种行为

编辑: 我基本上想使用我自己的回调函数,它没有WndProc签名。但是如果不使用静态或全局变量,我想不出从WndProc调用该函数的方法。 [这需要锁定,我认为这不是使用回调函数所能做的最好的事情,回调函数可能会被频繁调用。]


谢谢您的帮助。

您可以在那里对消息做出反应,但您仍然需要/希望调用
DispatchMessage
,并在正常的wndproc中实际处理消息。我很乐意就避免全局性问题和/或线程问题多说几句,但如果没有更多关于您希望避免的问题的详细信息,很难发表评论。

是的,如果您愿意,您可以自己处理消息。我通常将结果字段设置为0,但Windows仅在少数消息中使用此字段

是否允许不调用DispatchMessage(),而是自己处理消息?如果不是,我如何在避免全局变量和线程问题的同时很好地处理这种行为

如果您计划在GUI中使用多个线程,那么创建窗口的每个线程都需要管理自己的消息队列

从本页:

对消息循环的更改

具有多个线程的应用程序必须在每个线程中包含一个消息循环 创建窗口的线程。消息循环和窗口过程 对于窗口,必须由创建窗口的线程处理。 如果消息循环不在创建的同一线程中 在窗口中,DispatchMessage函数将不会获取 窗户。因此,窗口将出现,但不会显示激活 并且不会重新绘制、移动、接收鼠标消息或正常工作 正如你所期望的那样


避免全局变量和线程问题
你能解释一下这是什么意思吗?@Jesse:我想他指的是与使用非常量且由多个线程访问的全局变量相关的常见问题。每个使用它们的线程都必须使用锁定机制才能访问它们。@Jesse编辑。希望现在更好。只有在有多个线程时才需要锁定;上面的代码有一个线程:在线程返回到循环并处理下一条消息之前,对给定线程拥有的WndProc的每次调用都会完全完成,因此您不必在这里处理并发性问题。通常,Win32 UI是使用单个线程编写的,用于通过单个消息循环管理UI,因此您只需在使用其他线程进行后台工作的地方处理锁定。只有一个小扳手,但并非所有内容都通过消息循环
SendMessage()
从同一个线程(至少)直接转到
WndProc()
。消息循环所在的函数调用另一个函数,但这可以从多个线程/位置发生。此外,在创建窗口类时,我不能将此函数定义为回调函数,因为它没有正确的签名。我需要一种在不调用DefWindowProc的情况下调用此回调的方法。但与WndProc函数通信的唯一方式似乎是通过静态/全局参数。与WndProc函数通信的唯一方式似乎是通过静态/全局参数??有两个32位的“wParam,lParam”参数。这些可以包含指向您的函数的指针和指向任意多个参数的结构指针,或者您希望的任何类的实例。@MartinJames:当然,您是正确的,但要使您的答案完全解决他的问题,您需要在其中添加此注释。@MartinJames但是当我更改wParam/lParam变量时,原始信息丢失了吗?好吧,也许我可以制作一个结构,它保存原始参数和额外信息,并使用指向它的指针。这就是你的想法吗?@cooky451-基本上,是的,如果需要的话。我不知道您在邮件中使用参数的目的(如果有的话),因此我不想让我的评论复杂化。将结果字段设置为0是什么意思?什么结果字段?-这里似乎有两种观点,所以再多解释一下就好了。msg结构中有一个int result字段。