CreateThread(NULL,0,(unsigned   long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL);怎么去判断是否已经结束,以便终止它.用户有可能在没有执行完进程就把程序关了,从而造成程序报错

解决方案 »

  1.   

    HANGLE h=CreateThread(....);
    ...
    if(WaitForSingleObject(h,1000)==WAIT_OBJECT_0)
    {
       // 表示线程已经退出.
    }
      

  2.   

    判断是出来了,怎么去结束它呀?偶用的 TerminateThread 老是还是出错呢
      

  3.   

    TerminateThread老是出错是啥意思?
      

  4.   

    1. 用WaitForSingleObject判断是否已经中止
    2. 永远(如果可能)不要用TerminateThread去中止线程。线程退出唯一安全方法是它自己退出。因此,你需要用某种方式让线程自己退出,至于哪种方式合适,要看线程自己的逻辑
      

  5.   

    阿荣说的对,terminateThread一般别用.
    使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 --引用
      

  6.   

    偶现在的状况是这样的.创建了一线程去调用一成员函数从数据库中调出数据加载到CListCtrl里.这样做的目的是不让CListCtrl加载完了,才显示对话框,如果数据过多,由于要加载到ClistCtrl所以要等一会才显示对话,给用户造成一个死机或没有点中按钮的假象所以创建一线程,先把加载对话框其它信息,就显示对话,然后再访问数据库加载数据.实际上这个线程只起到了一个中介的作用,线程里有一句,就是调用另一成员函数
      

  7.   

    HANDLE hThread;//声明全局
    static DWORD WINAPI InsertThread(CTongJiJHCK *pDlg);//声明
    ==========================================================================
    在OnInitDialog()最后面加入
    DWORD uExitCode;
    GetExitCodeThread(hThread,&uExitCode);
    if(uExitCode==STILL_ACTIVE)
    {
    TerminateThread(hThread,uExitCode);
    }
            hThread=CreateThread(NULL,0,(unsigned   long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL);
    ===================================================================================
    DWORD WINAPI CTongJiJHCK::InsertThread(CTongJiJHCK *pDlg)
    {
    pDlg->InsertDataToList();//(这是CTongJiJHCK的成功函数)
    return 0;
    }
      

  8.   

    InsertDataToList();
    这个函数就是访问数据然后向CListCtrl加载数据如果数据没加载完用户关闭了对话框 就会出错.看了错误签名,就是应用程序的的名字   ModName:XXX.exe
      

  9.   

    DWORD uExitCode; 
    GetExitCodeThread(hThread,&uExitCode); 
    if(uExitCode==STILL_ACTIVE) 

    TerminateThread(hThread,uExitCode); 

    ================================
    这一句是没有必要的,从你的代码中看,InsertDataToList如果执行完成,这个线程函数用return 0返回,线程本身就已经结束了,根本就不用你自己想办法来让它结束.
      

  10.   

    至于没有加载完,用户就关闭对话框的问题,我觉得你应该让主线程阻塞一下,
    即在 hThread=CreateThread(NULL,0,(unsigned   long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL); 后面加一句WaitForSingleObject(hThread,....);
    或者,你处理一下WM_CLOSE消息也可以.
      

  11.   

    几千上万条数据加入到列表中,用户有可能并没有那耐心来等加载完数据后再关闭对话框吧.所以阻塞不是很好的方法.是否是数据没加载完关闭了对话框,而线程没有执行到return 0而造成的错误呢?
      

  12.   

    TerminateThread并不是不可用,只要你能确定在线程非正常结束的时候不会引起资源泄露就可以了,也不像其他人说得这么不安全,安不安全,看你怎么用而已.