【发布时间】:2021-08-17 10:58:26
【问题描述】:
我是一名电气工程师,正在 Visual Studio 中创建我的第一个 C++ Windows 10 应用程序。
当我启动我创建的应用程序时,我的应用程序窗口从它的菜单开始,我可以打开一个文件并开始处理该文件。此处理需要几分钟,并且 不能被中断太久(希望少于一毫秒)。
我遇到的问题是,当文件处理正在进行时,我的窗口菜单没有响应。当我在 Visual Studio IDE 下运行时,这是可以容忍的,但是当我运行独立应用程序的 .exe 文件时,应用程序的图形很快就会停止渲染,并且 Windows 会发布“无响应”错误消息。
有人可以指出我解决这些相关问题的正确方向吗?必须有一种简单的方法可以暂时将控制权交还给 WinMain 或 window_callback。
这是代码的简化结构:
LRESULT CALLBACK window_callback(HWND hwnd, UINT uMsg, ...) {
switch (uMsg) {
case WM_CREATE:
AddMenus(hwnd);
break;
case MY_FILE_OPEN:
open_file(hwnd);
break;
...
}
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ...) {
// Create Window Class
...
// Register Class
...
// Create Window
HWND window = CreateWindow(window_class.lpszClassName, L"My Window NAME", ...);
hdc = GetDC(window);
// My application's initialization code
...
while (running) {
MSG message;
while (PeekMessage(&message, window, ...) {
TranslateMessage(&message);
DispatchMessage(&message);
}
}
}
void open_file(HWND hwnd) {
here's where I call the file processing code (a several-minute loop);
}
【问题讨论】:
-
没那么简单,你得开个新线程来做。小心处理同步/锁定。
-
不要在GUI线程中做耗时的工作,大部分与GUI相关的功能都在GUI线程中执行。