对话框程序中有一静态的线程函数,线程函数中对对话框上的listctrl进行了操作.线程正在执行的时候点关闭按钮退出没有问题,但在线程正在执行的时候在listctrl上点几下再点关闭就会出错,在我的onclose函数中判断线程句柄如果有效就terminatethread 弹行退出.帮忙分析一下,我只想去掉那个出错对话框.(本来想在onclose里面等待线程结束,可是线程可能执行了多次.线程句柄是保存在一公共成员变量中.怎么都等不到它结束.调试的时候直到onclose函数结束都没问题,但继续单步走走到窗口过程函数里去了,在最后一步返回的时候就跳到汇编代码里了,提示this指针无效.)
最好的解决方法就是窗口关闭前通知线程主动退出,线程退出时发消息给窗口,然后窗口再销毁自己。
另一种解决方式是不要给线程传递类对象指针,改成传递ListCtrl或者窗口句柄,线程对利用句柄来执行操作。
1、有没有向线程发送退出指令?比如设置事件信号状态、或者设置退出标志。
2、你的线程句柄是怎么得到的?如果是在工作线程中GetCurrentThread得到的,主线程就无法使用这个句柄。
而且线程执行的过程大概有10多秒,并不是循环的.所以好怎么通知线程退出,才不得已用了terminatethread.
不知你可否有好的办法.
OnClickDevicelist(NMHDR* pNMHDR, LRESULT* pResult) 在listctrl点会调用这两个函数,我觉得这个函数有问题.
void CMydlg::OnSearch()//这个函数执行了多次.
{
m_hSear=CreateThread(NULL,0,SearchThread,this,0,NULL);
}void CMydlg::OnClose()
{
WaitForSingleObject(m_hSear,INFINITE);
CloseHandle(m_hSear);
}
在静态线程函数里面,LPVOID不要用this指针,而是创建一个简单的结构体,结构体存一些在线程中要控制的必要的变量,如:
class CParam
{
int iYourData;
bool bRunThread;//检查线程结束
};在对话框中保存一个该结构体的数组:vector<CParam*>vecParam;如果点击listctrl,需要创建线程,那么就new这么一个结构体出来,push到vecParam里面,再createThread(,,,(LPVOID)CParam*,)
然后线程里面检查
while((CParam*)lp->bRunThread)
{
dosth();
}在onclose时,就将保存的vecParam里面的所有bRunThread = false(赋为false)sleep一下等待所有线程退出,
最后关闭就好了(如果快速关闭,就直接ShowWindow(Sw_Hide),在后台退出线程就ok了供参考
gl