我正在编写一个多线程应用程序。在主线程上是主窗口,它是一个无模式对话框。当用户单击开始按钮时,它将创建一个新线程,该线程会长时间执行某些操作。在主线程上,它将创建一个新的无模式对话框来显示该新线程的状态,每个线程 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?还是其他地方的问题?