首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于关闭对话框会卡死的有关问题

2013-12-19 
关于关闭对话框会卡死的问题我在OnInitDialog()中加上StartTestProcess()开启一个线程,然后点一下按钮关

关于关闭对话框会卡死的问题
我在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); //为线程留出时间
  } ;

热点排行