- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个能够在主线程(创建 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/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!