CreateThread(NULL,0,(unsigned long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL);怎么去判断是否已经结束,以便终止它.用户有可能在没有执行完进程就把程序关了 CreateThread(NULL,0,(unsigned long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL);怎么去判断是否已经结束,以便终止它.用户有可能在没有执行完进程就把程序关了,从而造成程序报错 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HANGLE h=CreateThread(....);...if(WaitForSingleObject(h,1000)==WAIT_OBJECT_0){ // 表示线程已经退出.} 判断是出来了,怎么去结束它呀?偶用的 TerminateThread 老是还是出错呢 TerminateThread老是出错是啥意思? 1. 用WaitForSingleObject判断是否已经中止2. 永远(如果可能)不要用TerminateThread去中止线程。线程退出唯一安全方法是它自己退出。因此,你需要用某种方式让线程自己退出,至于哪种方式合适,要看线程自己的逻辑 阿荣说的对,terminateThread一般别用.使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 --引用 偶现在的状况是这样的.创建了一线程去调用一成员函数从数据库中调出数据加载到CListCtrl里.这样做的目的是不让CListCtrl加载完了,才显示对话框,如果数据过多,由于要加载到ClistCtrl所以要等一会才显示对话,给用户造成一个死机或没有点中按钮的假象所以创建一线程,先把加载对话框其它信息,就显示对话,然后再访问数据库加载数据.实际上这个线程只起到了一个中介的作用,线程里有一句,就是调用另一成员函数 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;} InsertDataToList();这个函数就是访问数据然后向CListCtrl加载数据如果数据没加载完用户关闭了对话框 就会出错.看了错误签名,就是应用程序的的名字 ModName:XXX.exe DWORD uExitCode; GetExitCodeThread(hThread,&uExitCode); if(uExitCode==STILL_ACTIVE) { TerminateThread(hThread,uExitCode); } ================================这一句是没有必要的,从你的代码中看,InsertDataToList如果执行完成,这个线程函数用return 0返回,线程本身就已经结束了,根本就不用你自己想办法来让它结束. 至于没有加载完,用户就关闭对话框的问题,我觉得你应该让主线程阻塞一下,即在 hThread=CreateThread(NULL,0,(unsigned long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL); 后面加一句WaitForSingleObject(hThread,....);或者,你处理一下WM_CLOSE消息也可以. 几千上万条数据加入到列表中,用户有可能并没有那耐心来等加载完数据后再关闭对话框吧.所以阻塞不是很好的方法.是否是数据没加载完关闭了对话框,而线程没有执行到return 0而造成的错误呢? TerminateThread并不是不可用,只要你能确定在线程非正常结束的时候不会引起资源泄露就可以了,也不像其他人说得这么不安全,安不安全,看你怎么用而已. 如何获取用户选择了UAC对话框中的哪个选项 socket()函数创建套接字失败,错误值是10106 关于IOCP UDP 的WSARecvFrom,只有一次完成状态 面试时碰到的问题,大家讨论下!! 请问关于关闭进程问题 如何在DLL中结束调用他的EXE? 各位VC高人,请教一个问题,如能帮忙,不胜感激,在此先谢过各位 高分寻求解决方案,UP者有分! 寻代码或方案 MFC应用程序部分在他人电脑上无响应求助 替换windows 2000/xp 的gina的步骤!!在线等!! 金融IT中VC的应用
...
if(WaitForSingleObject(h,1000)==WAIT_OBJECT_0)
{
// 表示线程已经退出.
}
2. 永远(如果可能)不要用TerminateThread去中止线程。线程退出唯一安全方法是它自己退出。因此,你需要用某种方式让线程自己退出,至于哪种方式合适,要看线程自己的逻辑
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 --引用
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;
}
这个函数就是访问数据然后向CListCtrl加载数据如果数据没加载完用户关闭了对话框 就会出错.看了错误签名,就是应用程序的的名字 ModName:XXX.exe
GetExitCodeThread(hThread,&uExitCode);
if(uExitCode==STILL_ACTIVE)
{
TerminateThread(hThread,uExitCode);
}
================================
这一句是没有必要的,从你的代码中看,InsertDataToList如果执行完成,这个线程函数用return 0返回,线程本身就已经结束了,根本就不用你自己想办法来让它结束.
即在 hThread=CreateThread(NULL,0,(unsigned long(_stdcall*)(void*))InsertThread, (LPVOID)this,0,NULL); 后面加一句WaitForSingleObject(hThread,....);
或者,你处理一下WM_CLOSE消息也可以.