2013-03-12 70 views
3

我在写一个多线程应用程序。主线程是主窗口,它是一个非模态对话框。当用户点击开始按钮时,它会创建一个新的线程,长时间执行一些东西。在主线程上,它会创建一个新的无模式对话框来显示新线程的状态,每个线程1个。我使用资源编辑器创建了一种模板对话框,并为该状态设置了一个静态文本,使其ID为IDC_STATIC_NUMCYCLE。我在OnIdle函数中轮询线程的状态。状态的更新只适用于1个线程,但是如果我更多地生成了所有的静态文本,它们将不会更新直到最后,或者它是唯一剩下的线程。多线程和MFC

声明:

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?还是其他地方的问题?

+1

这是函数实际上被调用? SetDlgItemText是否被调用?对话框指针是否正确填充? – Aneri 2013-03-12 10:43:36

+0

是的函数正在被调用,指针都没问题。 SetDlgItem被调用,但由于@Dialecticus指出它只是靠运气调用它。 – xilef 2013-03-18 05:51:59

回答

1

(temp%10000 == 0)条件对我很可疑。您假设温度将缓慢增加,以至于会检测到10000个标记。情况可能并非如此。如果要减少GUI操作,则为每个线程引入一个“最后一个计数”变量,并且只有在temp比这个变量足够大时才更新GUI,然后将其设置为temp。

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

+0

谢谢你,你帮助我。我太天真了,认为主线程能够获得循环值,因为它增加了1。我肯定会实现你提到的最后一个计数变量。 – xilef 2013-03-18 05:50:39

0

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

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

我很抱歉,但我目前没有MFC得心应手测试...