概述
在寻找前一篇文章中google breakpad的用法时,看到了关于windows函数RegisterWaitForSingleObject的用法,感觉还不错,而且在百度上面直接搜索RegisterWaitForSingleObject,出来的信息没怎么找到C++的,于是现在就来总结一下(水个博客)。RegisterWaitForSingleObject的详细介绍在https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-registerwaitforsingleobject。
RegisterWaitForSingleObject函数原型如下:
BOOL RegisterWaitForSingleObject(
PHANDLE phNewWaitObject,
HANDLE hObject,
WAITORTIMERCALLBACK Callback,
PVOID Context,
ULONG dwMilliseconds,
ULONG dwFlags
);
事实上,按照MSDN的说法,这个函数的作用相当于开了一条新线程,在该线程里面等待hObject的结束或dwMilliseconds超时后,按照dwFlags的要求执行Callback函数,传递Context作为参数而已,经常使用windows函数的程序员应该很容易就看出来了。
但是,还是有要注意的事项的:
- 关于phNewWaitObject,这个句柄在MSDN中明确说明了A pointer to a variable that receives a wait handle on return. Note that a wait handle cannot be used in functions that require an object handle, such as CloseHandle.即不可以通过CloseHandle直接关闭该句柄,必须使用UnregisterWait或者UnregisterWaitEx来关闭该句柄,即使使用WT_EXECUTEONLYONCE 也要这样子来取消注册。
- 关于hObject,在不使用WT_EXECUTEONLYONCE或者WT_EXECUTEINWAITTHREAD时,不要注册等待一直处于有信号状态的句柄,否则回调函数会执行很多次,直到改句柄变为无信号为止。
- 还是关于hObject的,如果在等待仍未完成的情况下关闭此句柄,则该函数的行为是未定义的。这也很容易理解,例如一个线程在等待hMutex,另一个线程在占用hMutex并直接关闭了,前一个线程就GG了。
- 关于UnregisterWaitEx的使用请查看该网址:https://docs.microsoft.com/zh-cn/windows/win32/sync/unregisterwaitex
其它注意的事项可以继续参阅前面的MSDN中关于该函数的网址。
下面贴一个本人在VS2017上使用该函数的小例子:
#include <Windows.h>
#include <thread>
#include <iostream>
VOID NTAPI WaitForThreadExit(PVOID, BOOLEAN)
{
std::cout << "thread exit" << std::endl;
}
int test()
{
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
int main()
{
std::thread t(test);
HANDLE hWait = NULL;
if (RegisterWaitForSingleObject(&hWait, t.native_handle(), WaitForThreadExit, NULL, INFINITE, WT_EXECUTEONLYONCE) == FALSE)
{
std::cout << "RegisterWaitForSingleObject fail, GetLastError " << GetLastError() << std::endl;
}
t.detach();
system("pause");
if (hWait != NULL)
{
UnregisterWaitEx(hWait, INVALID_HANDLE_VALUE);
hWait = NULL;
}
return 0;
}
以上就是本博客的全文,本人限于能力,上文中难免有错误的地方,若读者发现上文的错误,请于评论区中指出,本人看到之后会立即修改的,谢谢。
最后
以上就是花痴丝袜为你收集整理的关于RegisterWaitForSingleObject函数的使用总结的全部内容,希望文章能够帮你解决关于RegisterWaitForSingleObject函数的使用总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复