gpt4 book ai didi

c++ - 多线程和 MFC

转载 作者:太空狗 更新时间:2023-10-29 23:06:34 25 4
gpt4 key购买 nike

我正在编写一个多线程应用程序。在主线程上是主窗口,它是一个无模式对话框。当用户点击开始按钮时,它会创建一个新的线程来做一些很长时间的事情。在主线程上,它将创建一个新的无模式对话框来显示该新线程的状态,每个线程 1 个。我使用资源编辑器创建了一种模板对话框,并为状态设置了一个静态文本,使其 ID 为 IDC_STATIC_NUMCYCLE。我在 OnIdle 函数期间轮询线程的状态。状态的更新仅适用于 1 个线程,但如果我生成更多的静态文本,直到最后或者它是唯一运行的线程时才会更新。

声明:

map<CSimDlg *, CSimulator *> simulations;

我的 OnIdle 函数:

BOOL CFGSim1App::OnIdle(LONG lCount)
{
CWinApp::OnIdle(lCount);

DWORD exitCode;
CString numOfCycle;

for (map<CSimDlg *, CSimulator *>::iterator iter = simulations.begin(); iter != simulations.end();)
{
// skip already finished threads
if (iter->second == NULL)
{
iter++;
continue;
}
if (GetExitCodeThread(iter->second->m_hThread, &exitCode))
{
if (exitCode == 0)
{
delete iter->second;
iter->second = NULL;

if (IsWindow(iter->first->m_hWnd))
{
iter->first->SetDlgItemText(IDC_STATIC_SIMSTATUS, L"Simulation done");
}
else
{
iter = simulations.erase(iter);
}
}
else
{
ULONG64 temp = iter->second->m_ul64NumOfCycle;

if (temp % 10000 == 0)
{
numOfCycle.Format(_T("%d"), temp);
iter->first->SetDlgItemText(IDC_STATIC_NUMCYCLE, numOfCycle);
}

iter++;
}
}
else
{
iter++;
}
}

return TRUE;
}

我猜问题出在静态文本的 ID 上。有没有办法解决这个问题?或者我需要为每个对话框声明不同的 id 吗?还是其他地方的问题?

最佳答案

(temp % 10000 == 0) 条件对我来说很可疑。您假设 temp 将缓慢增加以检测到 10000 个标记。情况可能并非如此。如果您想减少 GUI 操作,则为每个线程引入一个“最后计数”变量,并且仅当 temp 足够大于此变量时才更新 GUI,然后将其设置为 temp。

顺便说一句,如果您对容器所做的只是遍历它,并且不使用 map 的特殊功能,则您不需要 std::map。它也可能是 std::pair 的列表,或者一些新结构的列表。这个新结构可以保存提到的最后一个计数变量。

关于c++ - 多线程和 MFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15358536/

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