gpt4 book ai didi

c++ - 如何从未创建该窗口的线程更新窗口?

转载 作者:行者123 更新时间:2023-11-28 05:53:03 25 4
gpt4 key购买 nike

我想创建一个能够在主线程(创建 GUI)运行一些长时间计算时更新 GUI 元素的线程,但我不知道该怎么做。我在 MSVC++ 中使用 win32 API。

因为这些计算时间长且占用大量 RAM,所以我想避免弄乱它们并将它们放在一个线程中。这意味着我希望能够直接从线程处理此 GUI 更新,而主窗口不必处理任何 WndProc 消息。

在最简单的情况下,我只希望能够从线程内部更新单个静态控件,但最终我希望能够在主窗口上绘制或在数据滚动时更新其中的位图图像从外部设备。我并不是说让线程完全接管窗口过程。

我尝试过非常简单的方法,例如:

// Global
HWND display;
DWORD WINAPI myThread(LPVOID threadParameter);

int APIENTRY WinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow){

// Blah Blah Create main Window and display object, which is a "STATIC" Blah Blah

HANDLE myThreadHandle = CreateThread(0, 0, myThread, (LPVOID)display, 0, &myThreadID);
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT7));

MSG msg;

// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CloseHandle(myThreadHandle);
return (int) msg.wParam;
}
// other function outside WinMain(){
DWORD WINAPI myThread(LPVOID threadParameter) {
// I've passed in my static handle here.
HWND hwnd = (HWND)threadParameter;
// My hope was that this would update the text of the static window, but...
PostMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"10");
// After this message the static window still hasn't updated with the text "10".
return 0;
};

但这不起作用(静态控件只是不更新​​)而且这只是一个猜测,所以我可能在做一些愚蠢的事情。我找不到关于在 C++ 中执行此操作的正确过程的任何资源,但我正在寻找与 this MSDN resource 类似的内容(在 C# 中)。

如果这有用,我当然可以上传我尝试的整个代码,但我认为我可能走错了路,所以我只包含了这个片段。

最佳答案

您不能让 UI 线程完成工作,并从工作线程更新 UI。该系统根本无法那样工作。主线程需要保持响应并及时处理其消息队列。需要从 UI 线程执行与窗口的交互。

您只需反转工作分配即可。让 UI 线程在 UI 上工作,让工作线程做密集的工作。

您似乎担心密集的工作会耗费时间并占用内存,并且不知何故线程不适合该任务。但事实并非如此。线程可用于执行长时间运行的计算。线程能够使用内存。

您似乎一无所获。在 UI 线程上处理 UI,并在工作线程上完成工作。仅此而已。

关于c++ - 如何从未创建该窗口的线程更新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34817551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com