MFC 一个可以正常运行的线程. 关闭后. 再打开.为什么就不能运行呢?

liudefang111 2019-08-30 11:20:58
一个可以正常运行的线程. 关闭后. 再打开.为什么就不能运行呢? 有什么办法可以再次打开后像首次打开一样正常运行.新手请教.

//打开线程
void CThread_lp::Stort()//
{
DWORD dwThreadID;
HANDLE htread = NULL;
htread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, 0, &dwThreadID);
m_hthread_lp = htread;//
}

//关闭线程
void CThread_lp::Stop()
{
if (m_hthread_lp)//如果线程存在
{
m_bExit = true;//设置信号
::WaitForSingleObject(m_hthread_lp , INFINITE);//等待线程结束
::CloseHandle(m_hthread_lp );
m_hthread_lp = NULL;
}
...全文
265 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-08-30
  • 打赏
  • 举报
回复
什么叫不能运行? 是不能启动线程? GetLastError() 看错信息
hhhh63 2019-08-30
  • 打赏
  • 举报
回复
应该是没有关闭
schlafenhamster 2019-08-30
  • 打赏
  • 举报
回复

/*
提取 CWinThread 对象的退出码需要额外的步骤. 默认时, CWinThread 线程终止时,
线程对象被删除了.就是说不能再存取 m_hThread 数据成员,因为 CWinThread 对象不再存在.
为此,要用如下2个方法之一:
设置 m_bAutoDelete 数据成员为 FALSE.
这样线程终止后 CWinThread 对象还在. 就可以存取 m_hThread 了. 使用这种方法要自己销毁
CWinThread 对象, framework 不会自动删除它了. 这是提倡的方法.
或者:
创建线程后立刻把线程句柄保存起来. 即复制 m_hThread (使用::DuplicateHandle)到另一个变量
并通过这个变量来存取. 这样对象终止时自动被删除,但你可以得到线程退出的原因.
注意在复制局柄前,线程不能退出. 安全的方法是创建线程时先 CREATE_SUSPENDED, 然后再ResumeThread.
*/

void CloseThread()
{
if((m_threaddraw==0) && (m_threadcomm==0)) return;
//
#if 1 // if must auto delete, such as there are resources have to be released
g_bExit=TRUE;
while(m_threadcomm->ResumeThread() != 0);
//
DWORD ret=WaitForSingleObject(m_threadcomm->m_hThread, 1000);//INFINITE);
if(WAIT_TIMEOUT==ret) AfxMessageBox("WAIT_TIMEOUT comm");
ret=WaitForSingleObject(m_threaddraw->m_hThread, 1000);//INFINITE);
if(WAIT_TIMEOUT==ret) AfxMessageBox("WAIT_TIMEOUT draw");
// "m_hThread signaled" does not mean thread is exits.
#ifdef CHECK_EXIT_CODE
DWORD ex;
do
{
if(!GetExitCodeThread(m_htmpcomm, &ex))
{// kill the thread
if(m_threadcomm) m_threadcomm->Delete();
break;
}
} while(ex==STILL_ACTIVE);
DWORD ex1;
do
{
if(!GetExitCodeThread(m_htmpdraw, &ex1))
{// kill the thread
if(m_threaddraw) m_threaddraw->Delete();
break;
}
} while(ex1==STILL_ACTIVE);
// BOOL rt=CloseHandle(m_htmpcomm);
// rt=CloseHandle(m_htmpdraw);
AfxMessageBox("Threads Exited with 0");
#endif
//
#else // if can terminate, that is , kill the threads.
if(m_threadcomm) m_threadcomm->Delete();
if(m_threaddraw) m_threaddraw->Delete();
#endif
}
worldy 2019-08-30
  • 打赏
  • 举报
回复

我明白了 ,你应该是在线程函数里代码是

while(!m_bExit)
{
.......
}

这样可以终止线程,没问题
zgl7903 2019-08-30
  • 打赏
  • 举报
回复
线程程序怎么写的?
schlafenhamster 2019-08-30
  • 打赏
  • 举报
回复

// run or stop
void CCEventDlg::OnButton1()
{
static BOOL stop=FALSE;
if(!stop)
{
GetDlgItem(IDC_BUTTON1)->SetWindowText("暂停");
if((m_threaddraw==0) && (m_threadcomm==0))
{
m_threaddraw=AfxBeginThread(AFX_THREADPROC(draw),(LPVOID)this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
// afxDump << this << "\n";
m_threadcomm=AfxBeginThread(AFX_THREADPROC(ReadComm),(LPVOID)this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
#ifdef CHECK_EXIT_CODE
DuplicateHandle(GetCurrentProcess(),m_threaddraw->m_hThread,GetCurrentProcess(),
&m_htmpcomm,0,FALSE,DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(),m_threadcomm->m_hThread,GetCurrentProcess(),
&m_htmpdraw,0,FALSE,DUPLICATE_SAME_ACCESS);
#endif
m_threaddraw->ResumeThread();
Sleep(0);// 让 draw 先运行
m_threadcomm->ResumeThread();
}
else
{
while(m_threadcomm->ResumeThread()!=0);
}
}
else
{
GetDlgItem(IDC_BUTTON1)->SetWindowText("运行");
while(m_threadcomm->SuspendThread()==0);
}
stop = !stop;
}
liudefang111 2019-08-30
  • 打赏
  • 举报
回复
worldy你好. 这段代码过后.线程确实没有运行了.但是否完全关闭.我也不得而知. 请问应该如何彻底的关闭呢
worldy 2019-08-30
  • 打赏
  • 举报
回复
void CThread_lp::Stop()
{
if (m_hthread_lp)//如果线程存在
{
m_bExit = true;//设置信号
::WaitForSingleObject(m_hthread_lp , INFINITE);//等待线程结束
::CloseHandle(m_hthread_lp );
m_hthread_lp = NULL;
}

你这样的代码能关闭线程吗?
liudefang111 2019-08-30
  • 打赏
  • 举报
回复
每次创建线程后GetLastError()返回值为0
liudefang111 2019-08-30
  • 打赏
  • 举报
回复
感谢zgl7903回复. 是不能运行了.没有任何反应.我这是在串口接收数据. 第一次打开程序.可以正常接收. 关闭线程后. 再打开. 就接受不到数据了. 在线程的循环里加了一个弹出确认对话框的提示. 可以知道第二次打开后. 就没有执行线程的循环过程了. 但是打开线程的过程并没有错误. 所以不知道为什么就没有真正的执行
不堪46 2021-08-12
  • 举报
回复
@liudefang111 在你的启动线程程序加入m_bExit = false;就可以了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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