发布信息免费的网站,wordpress怎么改中文,建设掌上银行官方网站,查询wordpress主题目录
1、WaitForSingleObject函数详细说明
2、在线程函数中调用WaitForSingleObject实现Sleep#xff0c;可立即退出Sleep状态
3、调用WaitForSingleObject函数监测线程或进程是否已经退出
3.1、子进程实时监测主进程是否已经退出#xff0c;主进程退出了#xff0c;则子…目录
1、WaitForSingleObject函数详细说明
2、在线程函数中调用WaitForSingleObject实现Sleep可立即退出Sleep状态
3、调用WaitForSingleObject函数监测线程或进程是否已经退出
3.1、子进程实时监测主进程是否已经退出主进程退出了则子进程要自动退出
3.2、启动子进程后等待子进程执行完退出后再执行后续操作 C软件异常排查从入门到精通系列教程专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_11931267.htmlVC常用功能开发汇总专栏文章列表欢迎订阅持续更新...https://blog.csdn.net/chenlycly/article/details/124272585C软件分析工具从入门到精通案例集锦专栏文章持续更新中...https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_2276111.html 在做多线程同步时我们经常调用WaitForSingleObject接口去等待事件、互斥量和信号量等对象获取这些对象的所有权。除了等待这些对象的作用外还可以去等待线程和进程今天就来结合日常的代码实践详细地总结一下WaitForSingleObject函数的用途。 1、WaitForSingleObject函数详细说明 WaitForSingleObject 函数检查指定对象的当前状态。 如果对象的状态未对齐则调用线程将进入等待状态直到发出对象信号或超时间隔已过。
DWORD WaitForSingleObject( [in] HANDLE hHandle, [in] DWORD dwMilliseconds );
此函数的参数说明说下 [in] hHandle 要等待的对象句柄。 WaitForSingleObject 函数可以等待以下对象 更改通知控制台输入可等待计时器内存资源通知事件Event互斥量Mutex信号量Semaphore线程Thread进程Process 句柄必须具有 SYNCHRONIZE 访问权限SYNCHRONIZE的说明如下 The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state. [in] dwMilliseconds 超时间隔以毫秒为单位。 如果指定了非零值则函数将等待直到发出对象信号或间隔已过。 如果 dwMilliseconds 为零则如果未向对象发出信号则函数不会进入等待状态;它始终立即返回。 如果 dwMilliseconds 为 INFINITE则函数仅在发出对象信号时返回。 关于WaitForSingleObject函数的说明可以查看微软MSDN上的说明
WaitForSingleObjecthttps://learn.microsoft.com/zh-cn/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject WaitForSingleObject 函数可以等待以下对象 更改通知控制台输入可等待计时器内存资源通知事件Event互斥量Mutex信号量Semaphore线程进程 对于事件分有信号和无信号两个状态当事件对象编程有信号时WaitForSingleObject立即返回。 对于互斥量和信号量调用WaitForSingleObject获取所有权即WaitForSingleObject返回WAIT_OBJECT_0时获取他们的所有权然后调用ReleaseMutex和ReleaseSemaphore释放对象的所有权。 对于线程和进程线程和进程创建时无信号当线程和进程退出时对应的句柄就变成了有信号这样WaitForSingleObject就返回了。可以通过WaitForSingleObject返回判断线程或进程是否已经退出了
WaitForSingleObject(hThread, INFINITE); // 参数INFINITE表示无限等待 在这里给大家重点推荐一下我的几个热门畅销专栏
专栏1该专栏订阅量接近350个有很强的实战参考价值广受好评专栏文章持续更新中预计更新到200篇以上
C软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931 本专栏根据近几年C软件异常排查的项目实践系统地总结了引发C软件异常的常见原因以及排查C软件异常的常用思路与方法详细讲述了C软件的调试方法与手段以图文并茂的方式给出具体的实战问题分析实例带领大家逐步掌握C软件调试与异常排查的相关技术适合基础进阶和想做技术提升的相关C开发人员 专栏中的文章均是通过项目实战总结出来的通过项目实战积累了大量的异常排查素材和案例有很强的实战参考价值专栏文章还在持续更新中预计文章篇数能更新到200篇以上 专栏2
C/C基础与进阶专栏文章持续更新中...https://blog.csdn.net/chenlycly/category_11931267.html 以多年的开发实战为基础总结并讲解一些的C/C基础与进阶内容以图文并茂的方式对相关知识点进行详细地展开与阐述专栏涉及了C/C领域的多个方面的内容同时给出C/C及网络方面的常见笔试面试题并详细讲述Visual Studio常用调试手段与技巧 专栏3
开源组件及数据库技术https://blog.csdn.net/chenlycly/category_12458859.html 以多年的开发实战为基础分享一些开源组件及数据库技术 2、在线程函数中调用WaitForSingleObject实现Sleep可立即退出Sleep状态 一般在线程的线程函数中设置一个循环在循环体中循环往复的执行相关的业务但不能让循环体中的代码中不停歇地执行否则线程会占用大量的CPU时间片会导致程序的高CPU占用问题。 当程序出现高CPU占用问题时基本都是程序中发生死循环了所在线程一直在不停歇地执行占用了大量的CPU时间片所以导致线程占用了较高的CPU比例。 所以我们一般都要在线程函数的循环体中人为地添加一个Sleep让线程时不时休息一下不要那么忙碌。当线程进入Sleep状态时线程就被挂起了线程停止执行系统不再给线程分配CPU时间片当Sleep时间到了后系统再唤醒线程给线程分配CPU时间片线程得以继续执行。 实现线程Sleep有两种方式一种是直接调用C函数Sleep睡眠另一种借助事件对象去实现Sleep。使用事件实现有个好处是能立即结束睡眠退出Sleep状态。比如在终止线程执行时能让Sleep立即停止线程函数中的循环尽快结束线程函数尽快退出。 下面举一个使用事件对象实现Sleep的例子我们在项目中多次使用了。先调用CreateEvent创建一个初始无信号手动的事件对象
// 创建一个手动的、初始无信号的事件对象
HANDLE hEvent ::CreateEvent( NULL, TRUE, FALSE, NULL );
然后在创建线程时将事件对象传到线程函数中
// 创建一个线程去处理事务
HANDLE hThread (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void *)hEvent, 0, NULL);
if (hThread ! NULL)
{CloseHandle( hThread );
} 在线程函数ThreadFunc中获取到传入的事件对象参数调用WaitForSingleObject函数实现Sleep通过WaitForSingleObject等待超时实现Sleep
unsigned _stdcall ThreadFunc(void *pParam)
{HANDLE hEvent (HANDLE)pParam;BOOL bStart TRUE;while (bStart){// ... // 此处的业务代码省略// 在循环体中调用WaitForSingleObject实现Sleep的效果::WaitForSingleObject(hEvent, 500); // 通过等待超时实现Sleep}return 1;
}
调用WaitForSingleObject进入等待状态时会将线程挂起这个Sleep的效果是一样的 最后在需要立即退出Sleep时调用SetEvent函数将事件置为有信号WaitForSingleObject立即返回。这样循环体就能尽快退出线程函数能尽快退出线程函数退出了线程就结束了。
// 调用SetEvent将事件对象置为有信号让WaitForSingleObject函数立即返回尽快退出循环
::SetEvent(hEvent);
3、调用WaitForSingleObject函数监测线程或进程是否已经退出 在主程序运行的过程中启动了一个子进程有时主进程要等待子进程处理结果后根据返回的信息再控制后续代码的执行有时子进程需要感知主进程是否已经退出这两种情况都需要感知另一个进程是否已经退出。对于线程在某些场合下页存在类似的需求。
3.1、子进程实时监测主进程是否已经退出主进程退出了则子进程要自动退出 主进程在运行过程中启动了一个子进程启动子进程时将主进程的进程id传给子进程。子进程是依赖于主进程存活的如果主进程退出或者崩溃了则子进程就没有存在的意义了要自动退出所以子进程要实时监测主进程的状态监测主进程有没有退出包括崩溃闪退。 可能有人会说主进程可以在退出时通知子进程子进程收到通知后再自行退出。但主进程可能会发生崩溃或闪退这种情况下一般时没法通知子进程的。 那子进程如何才能实时监测主进程是否退出了呢不管是主进程正常退出还是异常崩溃闪退都要感知到。子进程可以启动一个子线程在子线程中通过主进程传过来的主进程id获取主进程句柄然后调用WaitForSingleObject等待主进程退出可以在子线程中无限等待。如果主进程一旦退出WaitForSingleObject函数就会立即返回这时子进程就可以调用ExitProcess等接口自行退出当前子进程了。 具体的代码实现是子进程中启动一个子线程将主进程传过来的主进程id传给该子线程如下其中MonitorMainProcess是线程函数
HANDLE hThread (HANDLE)_beginthreadex( NULL, 0, MonitorMainProcess, (void*)dwMainProcessId, 0, NULL );
if ( hThread ! NULL )
{CloseHandle( hThread );
}
线程函数MonitorMainProcess实现如下
// 监控主工程
unsigned __stdcall MonitorMainProcess(void * pParam )
{DWORD dwProcessId (DWORD)pParam;HANDLE hProcess OpenProcess( SYNCHRONIZE, FALSE, dwProcessId );if(hProcess NULL){ExitProcess(-1);}// 设置INFINITE无限等待WaitForSingleObject( hProcess, INFINITE );CloseHandle( hProcess );// WaitForSingleObject返回了就表示主进程已经退出直接退出本进程ExitProcess( -1 );
} 进程初始是无信号的进程退出时就变成了有信号这样WaitForSingleObject等待到信号后就返回了这样子进程就直到主进程退出了。 此处需要注意一下调用OpenProcess时必须要设置SYNCHRONIZE参数因为设置该标记参数后才能调用WaitForSingleObject去等待进程。微软MSDN上对SYNCHRONIZE如下 SYNCHRONIZEThe right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state. 此外监测主进程是否退出的代码是阻塞式的不能放在主线程中的这就是为什么要启动一个子线程去专门做这个监测任务的原因。
3.2、启动子进程后等待子进程执行完退出后再执行后续操作 有时我们需要启动一个子进程去完成某项操作主进程在等待子进程的执行结果需要获取子进程的执行数据 然后主进程再去执行后续操作。主进程在启动子进程后就可以调用WaitForSingleObject等待子进程退出比如如下的代码
// 启动一个子进程去执行一个操作任务
STARTUPINFO s {sizeof(s)};
PROCESS_INFORMATION pi {0};
if( CreateProcess( NULL, cmdLine, NULL, NULL, TRUE, NULL, NULL, NULL, s, pi ) )
{ // 等待进程执行完毕 WaitForSingleObject( pi.hProcess, INFINITE ); // 关闭进程和主线程句柄CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
} // ... // 去拿子进程的执行结果去执行后续操作 有时启动一个子线程要等子线程执行完退出后根据处理结果信息去继续执行和上面等待进程退出是类似的。