MFC 多线程进度对话框

来源:百度知道 编辑:UC知道 时间:2024/05/25 19:30:00
我想在主线程里传输文件,新建一个线程,线程创建带有进度的对话框,如果对话框被取消则主现成的传输取消,如何实现呢?

我原来是在主线程定义这个对话框的对象dlg,对话框里有进度控件m_pro,在新线程里dlg.domal(),然后主线程修改dlg.m_pro.SetPos(x);但无法运行不了...但在dlg.m_pro.SetPos(x)前加一个AfxMessageBox()就行,为什么呢?
麻烦再帮我看一下,还是解决不了,以下是主线程
AfxBeginThread(Dg,this);
Sleep(3000);
AfxMessageBox("a"); // 若这句没的话,无论上面Sleep多久都显示不了新的对话框
while(flag && pp < 100)
{
pp += 10;
dlg.m_p.SetPos(pp);
}

以下是新线程:
UINT Dg(LPVOID pParam)
{
CTestDlg *p = (CTestDlg *)pParam;
if(p->dlg.DoModal() == IDCANCEL)
{
p->flag = false;
}
return 1;
}

再while循环前加了对话框以后,能弹出新进程框,也能改进度条,但在主线程while循环结束前,没办法按新对话框的取消键来结束,请再帮忙一下

第一个问题,可以有两种方法:
1. 用全局变量来传递信息,在新线程中如果对话框被取消,给该全局变量赋一个值,在主线程传输文件过程中判断该变量的值,如果是取消了,则主线程取消文件传输。
2. 用自定义消息,在新线程中如果对话框被取消,就向主线程所在窗体发送消息,在主线程中创建一个处理该消息的函数实现相应的功能即可。

第二个问题,原因可能是这样的:在主线程中定义对话框dlg,在新线程中dlg.domodal,然后在主线程修改,但问题是要保证主线程和新线程严格按照设定的顺序来执行。在主线程中启动新线程之后,主线程仍然在执行,有可能新线程中dlg.domodal还没执行,主线程dlg.m_pro.setpos已经执行过了,所以会出问题,加入AfxMessageBox之后在弹出窗口没有关闭之前主线程没有继续往下执行,这就使新线程有足够的时间执行dlg.domodal,所以能够执行成功。你可以在主线程建立对话框并启动新线程之后延时一段时间,再执行dlg.m_pro.setpos。

第一个问题,可以有两种方法:
1. 用全局变量来传递信息,在新线程中如果对话框被取消,给该全局变量赋一个值,在主线程传输文件过程中判断该变量的值,如果是取消了,则主线程取消文件传输。
2. 用自定义消息,在新线程中如果对话框被取消,就向主线程所在窗体发送消息,在主线程中创建一个处理该消息的函数实现相应的功能即可。

第二个问题,原因可能是这样的:在主线程中定义对话框dlg,在新线程中dlg.domodal,然后在主线程修改,但问题是要保证主线程和新线程严格按照设定的顺序来执行。在主线程中启动新线程之后,主线程仍然在执行,有可能新线程中dlg.domodal还没执行,主线程dlg.m_pro.setpos已经执行过了,所以会出问题,加入AfxMessageBox之后在弹出窗口没有关闭之前主线程没有继续往下执行,这就使新线程有足够的时间执行dlg.domodal,所以能够执行成功。你可以在主线程建立对话框并启动新线程之后延时一段时间,再执行dlg.m_pro.setpos。
回答者: lonia3390 - 江湖新秀 四级 4-23 19:14