线程函数应该设为全局或在类里设为Static会好点线程函数要用类A(对话框类)里的成员同时也要用到类A的指针。
但是如果设成类A里的static函数,退出这个类的话,类A指针是不是也就销毁掉了
这样线程函数就无法继续执行下去。(暂时我是传类A的this指针进去)
如果设成全局的话又该如何获取类A的数据成员和指针。
注:类A是一个对话框类,而且是用DoModal生成的。
我想让线程函数在DoModal对话框退出后依然能够执行。
这样该如何解决呢?
但是如果设成类A里的static函数,退出这个类的话,类A指针是不是也就销毁掉了
这样线程函数就无法继续执行下去。(暂时我是传类A的this指针进去)
如果设成全局的话又该如何获取类A的数据成员和指针。
注:类A是一个对话框类,而且是用DoModal生成的。
我想让线程函数在DoModal对话框退出后依然能够执行。
这样该如何解决呢?
===================
不要忘了,如果设成类的static成员函数的话,引用的类成员必须也要是static型的,另外,static型的函数或是成员和当前对象指针没有关系
你想让对话框退出后线程还能执行,那还是不要用类A的成员吧!
因为你可以在dialog定义一个函数如下所示:
DWORD WINAPI MyThreadProc(LPVOID lpParameter)
{
CMyDialog* pDialog = reinterpret_cast<CMyDialog*>(lpParameter);
return pDialog->InThreadProc(); // InThreadProc 是类的普通成员函数
}第二个问题
既然你将dialog指针传给了线程,那么在你的dialog析构函数中,需要先等待工作线程退出或直接关闭工作线程。
thread_proc(void* param){
if param==null,
stop.
else
class_a* pa=(class_a*)param}
mydlg.h
/** 对话框类 */
class CMyDlg
{
public:
/**
* 线程参数 ,用来传窗口的句柄
*/
class CThreadParam
{
public:
CThreadParam(HWND hWnd):m_hWnd(hWnd){}
HWND GetHwnd()const{return m_hWnd;}
private:
HWND m_hWnd;
};
afx_msg LRESULT OnRecvTheMessage(WPARAM wp,LPARAM lp);
static const UINT m_nMsgId;//线程用该消息来通知Dlg
static UINT ThreadFun(LPVOID);//线程函数
};mydlg.cpp
const CMyDlg::m_nMsgId = 12121;
//消息映射
BEGIN_MESSAGE_MAP
ON_MESSAGE(m_nMsgId,OnRecvTheMessage)
END_MESSAGE_MAP////某个用来启动线程的函数
void CMyDlg::SomeFunction()
{
CThreadParam threadParam(this->GetSafeHwnd());
AfxBeginThread(ThreadFun,&threadParam);
}
////对线程发来的消息进行响应
LRESUT CMyDlg::OnRecvMessage(WPARAM wp,LPARAM lp)
{
////在这里做你的响应
return S_OK;
}
UINT CMyDlg::ThreadFun(LPVOID lpParam)
{
CThreadParam* pParam = reinterpret_cast<CThreadParam*>(lpParam);
////做一些你想做的事
////发消息通知对话框,wparam,lparam是你自己可以填的一些参数
::PostMessage(pParam->GetHwnd(),m_nMsgId,wparam,lparam);
return 0;
}
replied by ebenzhang.blogbus.com
////某个用来启动线程的函数
void CMyDlg::SomeFunction()
{
////这里要用new。
CThreadParam* pThreadParam = new CThreadParam(this->GetSafeHwnd());
AfxBeginThread(ThreadFun,pThreadParam);
} ps:代码是我随手写的,不保证编译得过replied by ebenzhang.blogbus.com