实时显示变量变化

时间:2017-11-15 11:26:39

标签: c++ multithreading mfc

现在,我使用了代码:

UINT postThread(LPVOID pParam)
{
    CGA_SpikeDlg*p = (CGA_SpikeDlg*)pParam;
    p->RunTimer();
    return 0;
}
void CGA_SpikeDlg::threadNew()
{
    AfxBeginThread(postThread, this);
}

void CGA_SpikeDlg::RunTimer()
{
    SetTimer(1, 6000, NULL);
}

void task1(M_args Parameter_, double Mtime, double tempVB, double TimeStep, double m_I, int FlagParameter[], M_args_Bound Parameter_Bound[], int MaxGeneration, float gL, float C, const int POPULATION_SIZE, float crossver, float mutations, stringstream &strResult)
{
    solveGPU_cpp(Parameter_, Mtime, tempVB, TimeStep, m_I, FlagParameter, Parameter_Bound, MaxGeneration, gL, C, POPULATION_SIZE, crossver, mutations, strResult);
    //cout << "task1 says: " << endl;
}
void CGA_SpikeDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    switch (nIDEvent)
    {
        case 1:   //定时器1处理函数,定时发送数据进行更新
        {   

            CString cstr((strResult.str()).c_str());
            //str.Format("%f", duration);
            m_result.SetWindowText(cstr);
            UpdateData(false);
            break;
        }
    }
    CDialogEx::OnTimer(nIDEvent);
}
void CGA_SpikeDlg::OnBnClickedButtonRun()
{
    // TODO:  在此添加控件通知处理程序代码
    UpdateData(true);
    threadNew();
    thread t1(task1, Parameter_, Mtime, tempVB, TimeStep, m_I, FlagParameter, Parameter_Bound, MaxGeneration, gL, C, POPULATION_SIZE, crossver, mutations, std::ref(strResult));
    t1.join();
}

我想在我的编辑中显示strResult的值。我希望看到它在运行时如何变化。但是当我跑步时,窗口显示没有响应,一段时间后,它显示最终结果,这不是我想要的。

1 个答案:

答案 0 :(得分:0)

线程是局部变量并且连接它会导致主线程阻塞并等待辅助线程t1完成。

使线程成为指针或shared_ptr,如果对话框类确保至少在析构函数中join,则使其成为成员。

像:

mThread = std::make_shared<std::thread>(task1, Parameter_, Mtime, tempVB, TimeStep, m_I, FlagParameter, Parameter_Bound, MaxGeneration, gL, C, POPULATION_SIZE, crossver, mutations, std::ref(strResult));

而且......窗口计时器不需要线程。

<强>更新 使胎面成为对话框的成员:

std::stared_ptr<std::thread> mThread;

将所有参数打包在结构或类中:

struct Args
{
   M_args Parameter_;
   double Mtime;
   double tempVB;
   double TimeStep;
   double m_I;
   std::vector<int> FlagParameter;
   std::vector<M_args_Bound> Parameter_Bound;
   int MaxGeneration;
   float gL;
   float C;
   int POPULATION_SIZE;
   float crossver;
   float mutations;
};

复制结构中的所有数据并将其与strResult的引用一起传递给线程:

mThread = std::make_shared<std::thread>(Args, std::ref(strResult));

加入析构函数。确保你没有启动线程两次等。