本人遇到一个问题:
在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的。
请问这是为什么?怎么解决?请高人指点。

解决方案 »

  1.   

    在对话框的析构函数增加CloseHandle(hReadThread)试一下
      

  2.   

    我发现,如果线程的句柄hReadThread是类的成员函数,就肯定会报错。
    但是如果把hReadThread设置成全局变量,就不会。
    另外想请教一下,是不是CloseHandle(hReadThread)只能调用一次?我在两个消息处理函数中都CloseHandle(hReadThread),各执行一次,然后退出就肯定报错。
      

  3.   

    你把线程函数放封装到Dlg类里面了 而且还用了友员,感觉这样不太好吧,线程函数本来就是系统
    来调用的。还有像这种入口函数 不要先声明再定义吧,没见过main(),Winmain(),DLLmain(),这样的
    入口函数需要先声明在定义的,这些函数都是由系统调用的,建议把线程函数拿出来,然后用一个类
    去管理线程,而不要把线程函数封装起来。
      

  4.   

    CreateThread(NULL,0,ReadKeyThread,(LPVOID)1,0,&dwTStat); 
    ReadKeyThread 必须是全局或静态函数
      

  5.   

    句柄是成员变量一点问题都没有!
    我封装了一个线程类,在使用的时候没有任何问题,构造函数CreateThread,析构函数中CloseHandle,禁止了复制和赋值。
    正确使用不会有任何问题,当然,正确使用包括关闭句柄只能关闭一次,我一般会将关闭了的句柄赋值为NULL。关闭前当然也要判断是否为NULL。
      

  6.   

    他这个不是句柄的问题,包柄不过是一个DWORD值,放在哪里都一样,关键是他把线程函数放在类里了.