マルチスレッドアプリを書いています。メインスレッドには、モードレスダイアログボックスであるメインウィンドウがあります。ユーザーがスタートボタンをクリックすると、長い間いくつかのことを行う新しいスレッドが作成されます。メインスレッド上に、新しいモードレスダイアログボックスが作成され、その新しいスレッドのステータスがスレッドごとに1つ表示されます。リソースエディタを使用して一種のテンプレートダイアログボックスを作成し、ステータスの静的テキストをIDC_STATIC_NUMCYCLEのIDに設定しました。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を宣言する必要がありますか?それとも他の場所に問題がありますか?