本人遇到一个问题:
在MFC基于Dialog的工程中:
如以下类CADlg中,线程的执行函数定义为类CADlg的友元
class CADlg
{
...
public:
friend DWORD WINAPI ReadKeyThread(LPVOID lParam);
...
public:
afx_msg void OnBnClickedTest();
};
然后在CADlg的OnBnClickedTest()函数中用CreateThread创建线程:
hReadThread = CreateThread(NULL,0,ReadKeyThread,(LPVOID)1,0,&dwTStat);线程函数没有内容,立即返回,线程能够正常退出。
但当整个工程退出时,确弹出一个异常中止窗口,错误信息为:
Run-Time Check Failure #2 - Stack around the variable 'dlg' was corrupted.
错误定位在BOOL CEvaApp::InitInstance()的末尾
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
->}但是我把线程执行函数改为friend void ReadKeyThread(void* lParam);用_beginthread创建,程序退出则没有任何问题。
我还是不放心用_beginthread的。
请问这是为什么?怎么解决?请高人指点。
在MFC基于Dialog的工程中:
如以下类CADlg中,线程的执行函数定义为类CADlg的友元
class CADlg
{
...
public:
friend DWORD WINAPI ReadKeyThread(LPVOID lParam);
...
public:
afx_msg void OnBnClickedTest();
};
然后在CADlg的OnBnClickedTest()函数中用CreateThread创建线程:
hReadThread = CreateThread(NULL,0,ReadKeyThread,(LPVOID)1,0,&dwTStat);线程函数没有内容,立即返回,线程能够正常退出。
但当整个工程退出时,确弹出一个异常中止窗口,错误信息为:
Run-Time Check Failure #2 - Stack around the variable 'dlg' was corrupted.
错误定位在BOOL CEvaApp::InitInstance()的末尾
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
->}但是我把线程执行函数改为friend void ReadKeyThread(void* lParam);用_beginthread创建,程序退出则没有任何问题。
我还是不放心用_beginthread的。
请问这是为什么?怎么解决?请高人指点。
但是如果把hReadThread设置成全局变量,就不会。
另外想请教一下,是不是CloseHandle(hReadThread)只能调用一次?我在两个消息处理函数中都CloseHandle(hReadThread),各执行一次,然后退出就肯定报错。
来调用的。还有像这种入口函数 不要先声明再定义吧,没见过main(),Winmain(),DLLmain(),这样的
入口函数需要先声明在定义的,这些函数都是由系统调用的,建议把线程函数拿出来,然后用一个类
去管理线程,而不要把线程函数封装起来。
ReadKeyThread 必须是全局或静态函数
我封装了一个线程类,在使用的时候没有任何问题,构造函数CreateThread,析构函数中CloseHandle,禁止了复制和赋值。
正确使用不会有任何问题,当然,正确使用包括关闭句柄只能关闭一次,我一般会将关闭了的句柄赋值为NULL。关闭前当然也要判断是否为NULL。