关于关闭对话框会卡死的问题
我在OnInitDialog()中加上StartTestProcess();
开启一个线程,然后点一下按钮关闭线程,关闭对话框时,在release模式下会卡死,而在debug模式下不会,不知道是什么原因啊,谢谢各位
StartTestProcess();
bool MemberManagerDlg::StartTestProcess()
{
m_CloseThreadRoll = false;
//初始化为发送指令
m_RollThread = CreateThread(NULL, 0, ThreadTestRoll, this, 0, NULL);
CloseHandle(m_RollThread);
return true;
}
void MemberManagerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//关闭本窗体的轮询线程
this->m_CloseThreadRoll = true;
do
{
} while (m_bThreadAlive);
TRACE("RollThread ended\n");
}
[解决办法]
ThreadTestRoll里面是通过m_CloseThreadRoll来判断是否结束循环的吗?
这么做可能会有问题,我也是瞎猜。
也许关闭对话框时,ThreadTestRoll线程函数还没有结束。
然后MemberManagerDlg对话框对象马上被析构,所以ThreadTestRoll
中判断的this->m_CloseThreadRoll已经是不确定值了。
造成ThreadTestRoll线程无法结束。
通知线程关闭,最好还是用Wait事件吧。
[解决办法]
m_threadStopEvent = CreateEvent(NULL, TRUE, eventState, NULL);
if (NULL == m_threadStopEvent)
{
//CLIENT_ERROR("%s 创建事件失败,错误码:%d", __FUNCTION__, GetLastError());
return FALSE;
}
m_RollThread = CreateThread(NULL, 0, ThreadTestRoll, this, 0, NULL);
if (NULL == m_RollThread )
{
//CLIENT_ERROR("%s 创建线程失败,错误码:%d", __FUNCTION__, GetLastError());
return FALSE;
}
void MemberManagerDlg::OnBnClickedButton1()
{
if (NULL != m_threadStopEvent)
{
SetEvent(m_threadStopEvent);
WaitForSingleObject(m_RollThread , INFINITE);
CloseHandle(m_threadStopEvent);
CloseHandle(m_RollThread );
m_RollThread = NULL;
m_threadStopEvent = NULL;
}
用上面的去开、关线程,利用等待事件来处理。
lz你的是开了线程,然后又立马给关了。
m_bThreadAlive这个变量是什么?
[解决办法]
卡死有可能是m_bThreadAlive这个变量一直为true导致,需要看看在哪里设置的该变量
[解决办法]
m_CloseThreadRoll = true;
while (m_bThreadAlive)
{
Sleep(10); //为线程留出时间
} ;