现在,我使用了代码:
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的值。我希望看到它在运行时如何变化。但是当我跑步时,窗口显示没有响应,一段时间后,它显示最终结果,这不是我想要的。
答案 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));
加入析构函数。确保你没有启动线程两次等。