1. 我之前比较喜欢用的一种方法,就是SendMessage,但是,同事说这样的话,有时候同时调用,会出现内存抢占的现象,可以加一个锁。
2. 同事推荐,如下方法:
BOOL COperateTips::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extrainitialization here
HANDLE hThread= StartSaveDataThread();
if (!hThread)
{
LOG("启动导入数据线程失败")
}
return TRUE; // return TRUEunless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
HANDLE COperateTips::StartSaveDataThread()
{
LOG("启动教师提问保存数据线程");
CWinThread* hThread= AfxBeginThread((AFX_THREADPROC)COperateTips::SaveDataThread,(LPVOID)this);
return (hThread->m_hThread);
}
DWORD WINAPI COperateTips::SaveDataThread(LPVOID Param)
{
COperateTips* saveData= (COperateTips*)Param;
while (TRUE)
{
if (WAIT_FAILED ==::WaitForSingleObject(g_evtStuDemo.m_hObject,INFINITE))
{
DWORD dError =::GetLastError();
LOG("WaitForSingleObject函数出现错误,错误代码:%d,程序退出", dError);
return 1;
}
if (saveData ->m_sPicName.IsEmpty())
{
continue;
}
saveData ->ShowPicture(pPicShowDlg->m_sPicName);
}
return 0;
}
一. 在使用线程函数时,经常会遇到如下问题:
'type cast' : cannot convertfrom 'overloaded-function' to 'AFX_THREADPROC'
这是什么原因呢 ?
必须声明为静态成员函数。将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。
线程函数是独立于类的实例而存在的,他的生命期不是类的生命期,而是整个process。试想一下,如果可以用非静态成员函数作为线程函数,如果没有定义一个这个类的实例,岂不是无法调用线程函数了