关于线程退不出去的问题

xuyatianxyt 2018-12-04 05:31:06
求大神帮帮忙!!!在初始化这个窗口的时候,初始化线程的参数,然后启用线程,获取相关串口数据,但是为什么点击关闭的时候,然后就进入死循环不管用,线程也关闭不了?
...全文
369 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiger波波 2019-01-08
  • 打赏
  • 举报
回复

void Sdcs::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CDialogEx::OnClose();
if (m_IsOpen)
{
while (m_bThreadAlive)
{
SetEvent(m_EndThread);
}
m_port.PortClose();

}
m_IsOpen = FALSE;

}
你把CDialogEx::OnClose();放在最前边不好吧。 另外m_bThreadAlive定义的时候改为 volatile bool m_bThreadAlive; 试试
jacksonfan 2019-01-06
  • 打赏
  • 举报
回复
退出时 给线程发送PostThreadMessage(threadid, WM_QUIT, 0, 0)
不说害怕 2019-01-06
  • 打赏
  • 举报
回复
m_bThreadAlive 这个改成 volatile 的
不说害怕 2019-01-06
  • 打赏
  • 举报
回复
SetEvent这种代码写起来不太好写的. 而且要Wait等待 可以用变量来控制! 但变量要 volatile 的! 注意这个! 否则可能变量改变之后, 另外的线程取到的还是老数据. 被寄存器缓存了.
Eleven 2018-12-05
  • 打赏
  • 举报
回复
你只用一次SetEvent,然后在等待Thread退出,WaitForSingleObject(hThread, INFINITE);
schlafenhamster 2018-12-05
  • 打赏
  • 举报
回复
while (m_bThreadAlive) 这句 ?
AfxBeginThread(CommThread, this))) 可以 自动 退出,(见1 楼),用太多 event 不好 !

参考
// use ON_MESSAGE(a,b)
void CUload::OnCommNotify(WPARAM wParam,LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
int nLength;
BYTE abIn[6000];// for 115200 needs 4096 and more
DWORD totalrecv;
CString txt;
switch(wParam)
{
case 0:// from CommWatchCTS()
SetCTSIcon();
SetEvent(m_hPostEventRead);// tell watcher that CommNotify has been done
break;
case 1:// from CommWatchRead()
// append on each entry
CFile uldFile(UpLoadFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
uldFile.SeekToEnd( );
if (m_bConnected)
{
if(nLength=ReadCommBlock(abIn,BUFLEN))// 38400 needs 1024
{ // save into file
if (!m_bStart)
{ // only 1st
m_bStart=1;
InforOut("Receiving "+UpLoadFileName);
}
uldFile.Write(abIn,nLength);
}
}
uldFile.Close();
// get total bytes received
m_uldINs.GetText(0,txt);
totalrecv=atol(txt.GetBuffer(40));
totalrecv+=nLength;
txt.Format("%d",totalrecv);
m_uldINs.ResetContent();
m_uldINs.AddString(txt);
if (nLength>128)
{
Animate();
// reset "time waiting"
m_Elapse.ResetContent();
m_Elapse.AddString("0 s");
}
// tell watcher that CommNotify has been done
SetEvent(m_hPostEventRead);
break;
}
}
xuyatianxyt 2018-12-04
  • 打赏
  • 举报
回复
贴上代码
BOOL Sdcs::OnInitDialog()
{
CDialogEx::OnInitDialog();
//初始化线程的参数
InitEvent();
StartMonitoring();
}

void Sdcs::InitEvent()
{
m_Start = CreateEvent(NULL, TRUE, FALSE, NULL);
m_Pause = CreateEvent(NULL, TRUE, FALSE, NULL);
m_EndThread = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventArray[0] = m_Start;
m_hEventArray[1] = m_Pause;
m_hEventArray[2] = m_EndThread;
m_bThreadAlive = FALSE;
}

//启动线程
BOOL Sdcs::StartMonitoring()
{
if (!(m_Thread = AfxBeginThread(CommThread, this)))
{
return FALSE;
}
ResetEvent(m_EndThread);
TRACE("Thread started\n");
return TRUE;
}


UINT Sdcs::CommThread(LPVOID pParam) {
Sdcs *mycmd = (Sdcs*)pParam;
DWORD Event = 0;
mycmd->m_bThreadAlive = TRUE;
while (1)
{
Event = WaitForMultipleObjects(3, mycmd->m_hEventArray, FALSE, 0);
if (Event = WAIT_TIMEOUT){运用超时实时显示从串口接收的数据}
else if (Event == 0)
{
}
else if (Event == 1)
{
}
else if (Event == 2)
{
ResetEvent(mycmd->m_EndThread);
break;
}
else
{
break;
}
}

mycmd->m_bThreadAlive = FALSE;
return 0;

}

void Sdcs::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CDialogEx::OnClose();
if (m_IsOpen)
{
while (m_bThreadAlive)
{
SetEvent(m_EndThread);
}
m_port.PortClose();

}
m_IsOpen = FALSE;

}
然后点击关闭,直接卡死死循环了;

跪求各位大神帮忙!!!
xuyatianxyt 2018-12-04
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
请 复制 文字,不要图片 !
由于代码属于比较私密环境下的,电脑不能上网,不能插u盘,所以请见谅
schlafenhamster 2018-12-04
  • 打赏
  • 举报
回复
请 复制 文字,不要图片 !
xuyatianxyt 2018-12-04
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
增加一个线程退出标记, CommThread 中 判断这个标记 while(! bThreadExit) { ……}
有一个endtgread标记了,在退出的时候已经setevent了
xuyatianxyt 2018-12-04
  • 打赏
  • 举报
回复
有一个end_thread的退出标记啊
zgl7903 2018-12-04
  • 打赏
  • 举报
回复
增加一个线程退出标记, CommThread 中 判断这个标记 while(! bThreadExit) { ……}



xuyatianxyt 2018-12-04
  • 打赏
  • 举报
回复
求大神帮帮忙啊

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧