我是靠谱客的博主 花痴丝袜,最近开发中收集的这篇文章主要介绍关于RegisterWaitForSingleObject函数的使用总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在寻找前一篇文章中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函数的程序员应该很容易就看出来了。

但是,还是有要注意的事项的:

  1. 关于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 也要这样子来取消注册。
  2. 关于hObject,在不使用WT_EXECUTEONLYONCE或者WT_EXECUTEINWAITTHREAD时,不要注册等待一直处于有信号状态的句柄,否则回调函数会执行很多次,直到改句柄变为无信号为止。
  3. 还是关于hObject的,如果在等待仍未完成的情况下关闭此句柄,则该函数的行为是未定义的。这也很容易理解,例如一个线程在等待hMutex,另一个线程在占用hMutex并直接关闭了,前一个线程就GG了。
  4. 关于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函数的使用总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部