线程的挂起与唤醒

时间:2022-03-17 14:33:41

m_hThread = CreateThread(NULL,0,ThreadProcess,this,CREATE_SUSPENDED,NULL);

中间有定时器timeSetEvent(),间隔一个毫秒,调用一次回调函数,在回调函数中执行一次线程的唤醒动作
void CMainFrm::TimeCallBack()
{
................代码处理段
ResumeThread(m_hThread);

}

DWORD _stdcall ThreadProcess()
{
..............代码处理段
AfxMessageBox("线程被唤醒");
//处理完成后
SuspendThread(m_hThread);
return 0;
}

我的问题是:程序进来后,线程被唤醒了一次,再往后执行,就没有被唤醒了!我感觉是挂起时没有被挂起,所以后面的唤醒就无效了!求各路高手指点!

11 个解决方案

#1


线程中没有while或for循环,执行完一次线程不就退出了?

#2


你那个不叫线程 

#3


是事件对象,CreateEvent();线程中WaitForSingleObject

#4


引用 1 楼 zgl7903 的回复:
线程中没有while或for循环,执行完一次线程不就退出了?

我的循环是外部的定时保证的啊,用timeSetEvent(),每隔一个毫秒调用一次回调函数,然后在回调里面对线程再次唤醒!这样反复不行?

#5


引用 3 楼 visualeleven 的回复:
是事件对象,CreateEvent();线程中WaitForSingleObject


必须用事件对象?我看到一个简单的例子,他们做的就是CreateThread();
然后,后面就是直接对线程句柄的挂起和唤醒及终止操作!很简单的啊,有点费解了

#6


引用 2 楼 heksn 的回复:
你那个不叫线程

求指教

#7


’间隔一个毫秒‘太短了吧? 改100毫秒试试。

#8


‘ResumeThread(m_hThread);’
‘SuspendThread(m_hThread);’
为什么都不检查返回值?

#9


引用 4 楼 chongfeng90 的回复:
引用 1 楼 zgl7903 的回复:
线程中没有while或for循环,执行完一次线程不就退出了?

我的循环是外部的定时保证的啊,用timeSetEvent(),每隔一个毫秒调用一次回调函数,然后在回调里面对线程再次唤醒!这样反复不行?


你的循环只是唤醒操作,并没有重新启动线程啊
当线程第一次被唤醒后,会显示messagebox,然后又将自己挂起了
单簧管第二次被唤醒,则执行了return 0的操作,线程退出
此时线程句柄没有关闭,所以内核对象依然存在,只是线程已经结束运行了
只等着你关闭句柄后就释放线程内核对象了

#10


呵呵,楼主仔细想想吧,你这个流程是不是有点问题。。。画个流程图啥的你就明白啦
你创建了个线程,然后挂起,通过定时器去唤醒,然后呢?然后线程执行完功能之后再挂起,
再然后呢?再然后线程就执行完啦!!!问题就在这,所以楼上有人说while循环什么的去执行

#11


引用 10 楼 superhanxin5 的回复:
呵呵,楼主仔细想想吧,你这个流程是不是有点问题。。。画个流程图啥的你就明白啦
你创建了个线程,然后挂起,通过定时器去唤醒,然后呢?然后线程执行完功能之后再挂起,
再然后呢?再然后线程就执行完啦!!!问题就在这,所以楼上有人说while循环什么的去执行

呵呵!非常感谢各位的指点!问题已经得到解决!就是要在线程里面写循环,否则线程执行一次就退出了!大家要小心哟

#1


线程中没有while或for循环,执行完一次线程不就退出了?

#2


你那个不叫线程 

#3


是事件对象,CreateEvent();线程中WaitForSingleObject

#4


引用 1 楼 zgl7903 的回复:
线程中没有while或for循环,执行完一次线程不就退出了?

我的循环是外部的定时保证的啊,用timeSetEvent(),每隔一个毫秒调用一次回调函数,然后在回调里面对线程再次唤醒!这样反复不行?

#5


引用 3 楼 visualeleven 的回复:
是事件对象,CreateEvent();线程中WaitForSingleObject


必须用事件对象?我看到一个简单的例子,他们做的就是CreateThread();
然后,后面就是直接对线程句柄的挂起和唤醒及终止操作!很简单的啊,有点费解了

#6


引用 2 楼 heksn 的回复:
你那个不叫线程

求指教

#7


’间隔一个毫秒‘太短了吧? 改100毫秒试试。

#8


‘ResumeThread(m_hThread);’
‘SuspendThread(m_hThread);’
为什么都不检查返回值?

#9


引用 4 楼 chongfeng90 的回复:
引用 1 楼 zgl7903 的回复:
线程中没有while或for循环,执行完一次线程不就退出了?

我的循环是外部的定时保证的啊,用timeSetEvent(),每隔一个毫秒调用一次回调函数,然后在回调里面对线程再次唤醒!这样反复不行?


你的循环只是唤醒操作,并没有重新启动线程啊
当线程第一次被唤醒后,会显示messagebox,然后又将自己挂起了
单簧管第二次被唤醒,则执行了return 0的操作,线程退出
此时线程句柄没有关闭,所以内核对象依然存在,只是线程已经结束运行了
只等着你关闭句柄后就释放线程内核对象了

#10


呵呵,楼主仔细想想吧,你这个流程是不是有点问题。。。画个流程图啥的你就明白啦
你创建了个线程,然后挂起,通过定时器去唤醒,然后呢?然后线程执行完功能之后再挂起,
再然后呢?再然后线程就执行完啦!!!问题就在这,所以楼上有人说while循环什么的去执行

#11


引用 10 楼 superhanxin5 的回复:
呵呵,楼主仔细想想吧,你这个流程是不是有点问题。。。画个流程图啥的你就明白啦
你创建了个线程,然后挂起,通过定时器去唤醒,然后呢?然后线程执行完功能之后再挂起,
再然后呢?再然后线程就执行完啦!!!问题就在这,所以楼上有人说while循环什么的去执行

呵呵!非常感谢各位的指点!问题已经得到解决!就是要在线程里面写循环,否则线程执行一次就退出了!大家要小心哟