【问题标题】:C++ Windows application menus stop respondingC++ Windows 应用程序菜单停止响应
【发布时间】: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线程中执行。

标签: c++ windows


【解决方案1】:

如果您的应用程序没有运行PeekMessageTranslateMessageDispatchMessage 的主消息处理循环,那么正如您所注意到的,它将完全没有响应。这就是 Windows 使用的消息驱动事件循环的本质。

您要么需要在不同的线程中运行open_file,要么以某种方式对其进行分段,以便一次处理一小部分,然后返回并再次被调用以处理另一部分。

例如

    while (running) {
        MSG message;
        while (PeekMessage(&message, window, ...) {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
        open_file_piece();
    }

【讨论】:

  • 我使用线程让它工作。我了解了 thread.join() 和 thread.detach() 之间的区别。 detach 方法是我所需要的,因为我的文件处理线程需要 WinMain 在线程运行时继续运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多