多线程和MFC
Multithreading and MFC
我正在编写一个多线程应用程序。在主线程上是主窗口,这是一个非模态对话框。当用户单击开始按钮时,它将创建一个新线程,该线程将长时间执行某些操作。在主线程上,它将创建一个新的非模态对话框来显示新线程的状态,每个线程一个。我使用资源编辑器创建了一种模板对话框,并为状态设置了一个静态文本,其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)条件对我来说是可疑的。您假设温度将缓慢地增加到可以检测到10000个标记。事实可能并非如此。如果你想减少GUI操作,那么为每个线程引入一个"最后计数"变量,并且只有当temp比这个变量足够大时才更新GUI,然后将其设置为temp。
顺便说一句,如果你对容器所做的一切都是遍历它,那么你不需要std::map
,并且不使用地图的特殊功能。它也可以是一个std::pair
的列表,或者是一个新结构的列表。这个新结构可以保存前面提到的last count变量
我觉得你的逻辑还不错。也许MFC可以在文本更改后要求重新绘制请求:
iter->first->SetDlgItemText(IDC_STATIC_NUMCYCLE, numOfCycle);
iter->first->Invalidate();
我很抱歉,但目前我没有MFC方便的测试…
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- MFC多线程程序可以以并行方法运行
- 使用 MFC 的结构多线程
- 关闭MFC对话框时多线程对象被破坏
- 在 MFC C++中使用多线程
- 为什么Visual Studio显示多个线程,即使我的MFC应用不是多线程的?
- 在MFC中实现多线程,以更新外部函数可访问的内部字典
- 多线程和MFC