线程等待一定时间和及时返回继续执行,以及等待线程退出。
2017-01-12 16:33
573 查看
创建线程后让线程定时执行,可以通过sleep(time).
但我们一般可以通过在使用WaitForSingleObject(HANDLE handle,
DWORDdwMilliseconds)来等待。
如果不让线程做等待过程的返回操作,便可直接使用线程句柄等待即可。
DWORD WINAPICGisOper::VehStatusThread(LPVOID pParam)
{
…
while(WaitForSingleObject(m_hThread, 3000))
{} //这里线程会一直等待。每隔3秒执行一次。
此时m_hThread的状态:
对于线程来讲,如果线程在运行状态则为无信号状态,在退出后为有信号状态。所以我们可以使用 WaitForSingleObject
来等待线程退出,
Eg: WaitForSingleObject(m_hThread,3000);
Closehandle(m_hThread);
m_hThread = NULL;
}
如果线程在等待过程中需要及时唤醒向下执行,那么一般常用的方法我们可以创建一个事件对象,来触发WaitForSingleObject等待的返回。
如:DWORD WINAPI CGisOper::VehStatusThread(LPVOID pParam)
{
…
while(WaitForSingleObject(m_hEvent, 3000))
{} //这里线程会一直等待。每隔3秒执行一次。
此时可以根据m_hEvent是否有无信号来触发是否返回,如果正在等到过程中,需要在需要返回的时机去触发m_hEvent成为有信号状态则会返回等待。比如点击按钮时,调用SetEvent(m_hEnent)置为有信号状态。
}
因为函数WaitForSingleObject(
HANDLE hHandle, DW
ORD dwMilliseconds)
hHandle对象句柄。可以指定一系列的对象,如Event、Job、Memory
resourcenotification、Mutex、Process、Semaphore、Thread、Waitabletimer等,
dwMilliseconds定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回,即若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
也就是说要么被触发一下,告诉函数要返回了,要么超时了才能返回。
参考:http://blog.csdn.net/u011507161/article/details/42462079
创建事件对象:
m_hEvent = CreateEvent(
NULL, /*默认安全性*/
FALSE, /*指定创建的是人工还是自动对象,true人工,false自动*/
FALSE/*事件对象初始状态,true有信号,否则无信号*/
, NULL);
等待线程退出
WaitForSingleObject(m_hThread, 3000);
Closehandle(m_hThread);
m_hThread = NULL;
因为线程执行时m_hThread为无信号状态,返回了才有信号,所以一旦等到句柄状变化,说明线程可以返回了。
但我们一般可以通过在使用WaitForSingleObject(HANDLE handle,
DWORDdwMilliseconds)来等待。
如果不让线程做等待过程的返回操作,便可直接使用线程句柄等待即可。
DWORD WINAPICGisOper::VehStatusThread(LPVOID pParam)
{
…
while(WaitForSingleObject(m_hThread, 3000))
{} //这里线程会一直等待。每隔3秒执行一次。
此时m_hThread的状态:
对于线程来讲,如果线程在运行状态则为无信号状态,在退出后为有信号状态。所以我们可以使用 WaitForSingleObject
来等待线程退出,
Eg: WaitForSingleObject(m_hThread,3000);
Closehandle(m_hThread);
m_hThread = NULL;
}
如果线程在等待过程中需要及时唤醒向下执行,那么一般常用的方法我们可以创建一个事件对象,来触发WaitForSingleObject等待的返回。
如:DWORD WINAPI CGisOper::VehStatusThread(LPVOID pParam)
{
…
while(WaitForSingleObject(m_hEvent, 3000))
{} //这里线程会一直等待。每隔3秒执行一次。
此时可以根据m_hEvent是否有无信号来触发是否返回,如果正在等到过程中,需要在需要返回的时机去触发m_hEvent成为有信号状态则会返回等待。比如点击按钮时,调用SetEvent(m_hEnent)置为有信号状态。
}
因为函数WaitForSingleObject(
HANDLE hHandle, DW
ORD dwMilliseconds)
hHandle对象句柄。可以指定一系列的对象,如Event、Job、Memory
resourcenotification、Mutex、Process、Semaphore、Thread、Waitabletimer等,
dwMilliseconds定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回,即若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
也就是说要么被触发一下,告诉函数要返回了,要么超时了才能返回。
参考:http://blog.csdn.net/u011507161/article/details/42462079
创建事件对象:
m_hEvent = CreateEvent(
NULL, /*默认安全性*/
FALSE, /*指定创建的是人工还是自动对象,true人工,false自动*/
FALSE/*事件对象初始状态,true有信号,否则无信号*/
, NULL);
等待线程退出
WaitForSingleObject(m_hThread, 3000);
Closehandle(m_hThread);
m_hThread = NULL;
因为线程执行时m_hThread为无信号状态,返回了才有信号,所以一旦等到句柄状变化,说明线程可以返回了。
相关文章推荐
- 线程池等待一定数目的线程执行完毕之后返回结果
- python 等待一定时间后继续执行其后的程序
- 多线程中主线程等待所有子线程执行完再继续执行的解决方法
- 如何做到当某线程拿不到锁时不继续等待立刻退出?
- 线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积
- 多线程中主线程等待所有子线程执行完再继续执行的解决方法
- java线程池主线程等待子线程执行完成后再继续处理后面工作
- Monitor线程操作(当一个线程中处于等待状态时,另外一个线程来解锁它的等待状态继续执行下去)
- CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- 子线程返回前,使循环暂停但不使主线程卡死的办法,等待子线程有返回了之后,才执行主线程下一步代码的方法
- 判断一个线程是否执行结束以及获取线程退出码
- Java并发:主线程等待多个子线程执行完才继续执行
- oracle 等待一定时间执行下面的语句
- java线程池主线程等待子线程执行完成后再继续处理后面工作
- 多个子线程并发执行,主线程等待所有子线程都结束后再继续运行
- java 线程wait()与notify()的用法(被唤醒后的线程到底重新执行同步代码块还是从那是等待的那里继续执行)
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- 子线程,队列,以及监控执行时间