多线程和MFC

Multithreading and MFC

本文关键字:MFC 多线程      更新时间:2023-10-16

我正在编写一个多线程应用程序。在主线程上是主窗口,这是一个非模态对话框。当用户单击开始按钮时,它将创建一个新线程,该线程将长时间执行某些操作。在主线程上,它将创建一个新的非模态对话框来显示新线程的状态,每个线程一个。我使用资源编辑器创建了一种模板对话框,并为状态设置了一个静态文本,其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方便的测试…