MFC 线程中使用 updatedata()函数问题。
我用MFC写了一个窗口程序,由于点开始运行按钮后,需要一个while循环,于是我把要运行的部分写到一个线程中。是这样实现的,在窗口类中创立线程,并且写了一个函数task(...
我用MFC写了一个窗口程序,由于点开始运行按钮后,需要一个while循环,于是我把要运行的部分写到一个线程中。 是这样实现的,在窗口类中创立线程,并且写了一个函数task()作为该窗口类的成员函数,定义了一个全局变量*glbp,用来指向当前窗口类的指针,glbp=this来实现,在线程的运行函数中使用了glbp->task();但是我task函数里面用到了updatedata()函数,编译无错,运行的时候就报错了,如果不放到线程中运行,就没事。该如何解决此类问题啊?我觉得就是线程中调用了updatedata()函数导致的错误。
展开
3个回答
展开全部
你不要在线程中调用UpdateData,你用SendMessage或者PostMessage向窗口发送自定义消息,然后在窗口类的响应中调用UpdateData。
追问
能说的详细一点吗?比如线程中如何写?? 窗口类的响应中是指?如何生成?class向导里面选择一下吗?
追答
比如你的类叫CMyDialog,那么添加这么一个函数
LRESULT CMyDialog()::OnUpdateMyData(WPARAM wParam, LPARAM lParam)
{
UpdateData();
return 0;
}
然后定义在头文件定义一个常量
#define WM_UPDATEMY_DATA ((WM_USER) + 500)
在CPP文件中BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入
ON_MESSAGE(WM_UPDATEMZ_DATA, CMyDialog::OnUpdateMyData)
启动线程,假定你的线程函数是类CMyDialog的static成员函数ThreadProc,那么它必须如下定义
class CMyDialog ....
{
....
static DWORD CALLBACK ThreadProc(LPVOID pPara);
...
};
创建线程:
HANDLE hThread = CreateThread(NULL, 0, CMyDialog::ThreadProc, (LPVOID)this, 0, NULL);
_ASSERTE(hThread);
CloseHandle(hThread);
线程函数里:
DWORD CALLBACK CMyDialog::ThreadProc(LPVOID pPara)
{
VERIFY(CMyDialog* pThisInstance = (CMyDialog*)pPara);
// 要更新的地方
pThisInstance->PostMessage(WM_UPDATEMY_DATA);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询