一个对话框程序,默认有一个按钮"确定",其默认处理函数为:
CMyDialog::OnMyOk
{
CDialog::OnOk()
}
可是我希望在上面的函数中开辟一个新线程,而且去掉默认的OnOk(),之所以这样做是因为我想在新线程完成后,立即关掉主线程,即点击"确定"按钮后,执行新线程的操作,完成后,立即关闭主线程。因为在执行新线程内的操作时,我要在mydialog内显示一些动画,这样可以避免主线程被锁定。形如:
CMyDialog::OnMyOk
{
AfxBeginThread(_myThread,this);//开始新线程,并将myDialog传入线程
//CDialog::OnOk()//去掉默认处理函数
}UINT _myThread(LPVOID lparam)
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
....//do sth.
//问题在这里,在新线程执行完代码后,我应该如何做才能关闭myDialog?//我试了几种方法如下,但均没有成功!
1、para->ONOK();///error,因为OnOk()是protected;
2、::SendMessage(para->m_hWnd,WM_QUIT(或者是WM_CLOSE),NULL,NULL);//无作用
3、为Mydialog添加成员函数CMyDialog::Myok(){CDialog::OnOk();}.
然后:para->Myok()//内存错误。
4、设立事件hEvent,即在主线程的CMyDialog::OnMyOk()中等待,新线程的工作完成后执行SetEvent(hEvent),形如:
CMyDialog::OnMyOk
{
AfxBeginThread(_myThread,this);//开始新线程,并将myDialog传入线程
WaitForSingleObject(hEvent);//这样做依然会阻塞主线程,不符合要求。
}
//所以,请各位帮助解决一下,多谢!!!!
CMyDialog::OnMyOk
{
CDialog::OnOk()
}
可是我希望在上面的函数中开辟一个新线程,而且去掉默认的OnOk(),之所以这样做是因为我想在新线程完成后,立即关掉主线程,即点击"确定"按钮后,执行新线程的操作,完成后,立即关闭主线程。因为在执行新线程内的操作时,我要在mydialog内显示一些动画,这样可以避免主线程被锁定。形如:
CMyDialog::OnMyOk
{
AfxBeginThread(_myThread,this);//开始新线程,并将myDialog传入线程
//CDialog::OnOk()//去掉默认处理函数
}UINT _myThread(LPVOID lparam)
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
....//do sth.
//问题在这里,在新线程执行完代码后,我应该如何做才能关闭myDialog?//我试了几种方法如下,但均没有成功!
1、para->ONOK();///error,因为OnOk()是protected;
2、::SendMessage(para->m_hWnd,WM_QUIT(或者是WM_CLOSE),NULL,NULL);//无作用
3、为Mydialog添加成员函数CMyDialog::Myok(){CDialog::OnOk();}.
然后:para->Myok()//内存错误。
4、设立事件hEvent,即在主线程的CMyDialog::OnMyOk()中等待,新线程的工作完成后执行SetEvent(hEvent),形如:
CMyDialog::OnMyOk
{
AfxBeginThread(_myThread,this);//开始新线程,并将myDialog传入线程
WaitForSingleObject(hEvent);//这样做依然会阻塞主线程,不符合要求。
}
//所以,请各位帮助解决一下,多谢!!!!
解决方案 »
- vector<int> m_vector,其中一个线程将第一个元素erase掉,另一个线程往m_vector push_back值,那么这样会不会出现问题?如下
- vs 2005下怎么像vc6.0添加指定基类的类?
- 请教:如何从CString中把所有的数找出来?
- 知道一个控件的hwnd,怎么找到它所在的对话框?
- Xvid MPEG-4 Codec编码器使用问题
- 图像处理中,进行复数操作,调用complex<double>,不成功?
- 最近在做listctrl,需要下面的功能,请问怎么实现?
- 有谁做过AUTOCAD中数据格式向ARCGIS或者Mapinfo转换?
- 有没有函数可以直接删除一个目录(不论目录中有没有文件)(声明本人不需要自己写函数)
- 各位:如何控制对话框初始位置并使之不可移动 急用!
- opengl中加纹理
- 请问:如何在View下把文本文件分行显示,并把我需要的行加上背景色?
一般来说On开头的函数都这么调用。
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
para->PostQuitMessage(0);
}
CMyDialog::OnMyOtherOk
{
CDialog::OnOk();
}
在线程中
para->OnMyOtherOk();
就搞定!
UINT _myThread(LPVOID lparam)
{
CMyDialog* para=(CMyDialog*)lparam;//得到myDialog
para->SendMessage(WM_CLOSE,0,0);
}