多线程和MFC

我正在编写一个多线程应用程序。 主线程是主窗口,它是一个非模态对话框。 当用户点击开始按钮时,它会创建一个新的线程,长时间执行一些东西。 在主线程上,它会创建一个新的无模式对话框来显示新线程的状态,每个线程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)条件对我很可疑。 您假设温度将缓慢增加,以至于会检测到10000个标记。 情况可能并非如此。 如果要减少GUI操作,则为每个线程引入一个“最后一个计数”变量,并且只有在temp比这个变量足够大时才更新GUI,然后将其设置为temp。

顺便说一句,如果你使用容器做的所有事情都是遍历它,并且不使用地图的特殊功能,那么你不需要使用std::map map。 它可能是std::pair列表,或者是一些新结构的列表。 这个新结构可以容纳提到的最后一个计数变量。


你的逻辑对我来说似乎很好。 也许MFC在文本更改后可能需要重新绘制请求:

iter->first->SetDlgItemText(IDC_STATIC_NUMCYCLE, numOfCycle);
iter->first->Invalidate();

我很抱歉,但目前我没有MFC方便测试...

链接地址: http://www.djcxy.com/p/39235.html

上一篇: Multithreading and MFC

下一篇: How Do I Launch a Dialog in MFC?