WindowProc调用定时
WindowProc Invocation Timing
我是win32消息的新手。我想知道,当一个窗口进程是在处理一个消息的中间,它是可能被中断,以处理另一个消息?以下面的例子为例,如果[A]和[B]都被执行,是否有可能在[A]和[B]之间中断WindowProc来处理新的WM_ACTIVATE和/或WM_ACTIVATEAPP消息(作为ShowWindow调用的结果)?如果这是可能的,有没有什么特殊的情况使其成为可能?
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
{
...
case WM_ACTIVATEAPP:
if (wParam == FALSE)
{
// [A] Do something that would trigger a WM_ACTIVATE or WM_ACTIVATEAPP message to be queued to the message queue
ShowWindow(hwnd, SW_MINIMIZE);
// [B] Modify Window Styles
SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE);
}
break;
...
}
谢谢你的评论!
No。这就是 GUI线程的意义——它是一个线程一次只做一件事。如果您正在处理消息,则不能调用GetMessage
系统将永远不会调用这个回调函数,而它正在处理另一个消息,因为所有的消息都被放入队列中,并且(无论是你的代码还是你使用的框架,如MFC
)一个接一个地退出队列,没有重叠。除非一条消息被处理完,否则控件不会返回到退出队列块。
事实上,您可以安全地将window
代码视为单线程。如果你有多个窗口运行在一个应用程序中,它们都是序列化的,并且仍然在单个线程中运行。
实际上你需要创建单独的线程,如果你想并行地运行你的窗口(或工人)。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- Ardunio UNO解决了多个重叠的定时器循环
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 是否可以制作一个定时函数,该函数可以将函数作为参数调用,然后运行并计时
- 在 CPP 中将函数调用定时为 if 语句条件
- 使用线程以定时间隔调用函数
- WindowProc调用定时
- 迷你OS -III定时器回调函数没有被调用