首页 > 系统相关 >Windows线程API —CreateTimerQueueTimer/DeleteTimerQueueTimer的使用

Windows线程API —CreateTimerQueueTimer/DeleteTimerQueueTimer的使用

时间:2023-08-26 18:12:08浏览次数:40  
标签:HANDLE Windows API 线程 CreateTimerQueueTimer test DeleteTimerQueueTimer 回调

问题代码:

 1 #include<windows.h>
 2 #include<iostream>
 3 #include<thread>
 4 HANDLE h1;
 5 HANDLE h2;
 6 
 7 void CALLBACK test(PVOID a, BOOLEAN b)
 8 {
 9     std::cout << "This a test function excuted by Thread:" << std::this_thread::get_id()<< std::endl;
10     //std::cout << "Here we try to delete timer in Thread:" << std::this_thread::get_id() << std::endl;
11     if (0 == DeleteTimerQueueTimer(NULL, h1, INVALID_HANDLE_VALUE))
12     {
13         std::cout << "Timer  Deleted Failed in Thread:" << std::this_thread::get_id() << std::endl;
14     }
15     std::cout << "Timer  Deleted Successfully in Thread:" << std::this_thread::get_id() << std::endl;
16 
17 }
18 void CALLBACK test1(PVOID l, BOOLEAN t)
19 {
20     std::cout << "This a test1 function excuted by Thread:" << std::this_thread::get_id() << std::endl;
21 }
22 
23 int main()
24 {
25     
26     std::cout << "******This is a Test for TimeQueueTimer in Windows API******" << std::endl;
27     std::cout << "Main thread is executed by thread: " << std::this_thread::get_id() << std::endl;
28     //test(PVOID(1), TRUE);
29     try
30     {
31         CreateTimerQueueTimer(&h1, NULL, WAITORTIMERCALLBACK(test), NULL, 0, 1000, WT_EXECUTEINTIMERTHREAD);
32         //Sleep(1000);
33 
34         CreateTimerQueueTimer(&h2, NULL, WAITORTIMERCALLBACK(test1), NULL, 0, 1000, WT_EXECUTEINTIMERTHREAD);
35 
36 
37         //CreateTimerQueueTimer(&h1, NULL, [](PVOID lpParameter, BOOLEAN TimerOrWaitFired) {
38         //    test(lpParameter, TimerOrWaitFired); // Call your original test function from within the lambda
39         //    }, NULL, 0, 1000, WT_EXECUTEINTIMERTHREAD);
40 
41     }
42     catch (const std::exception& e)
43     {
44         std::cout << "something error with the timer: " << e.what() << std::endl;
45     }
46 
47 
48     if (std::cin.get())
49     {
50         if (0 == DeleteTimerQueueTimer(NULL, h2, INVALID_HANDLE_VALUE))
51         {
52             std::cout << "Timer  Deleted Failed in Thread:" << std::this_thread::get_id() << std::endl;
53         }
54         std::cout << "Timer  Deleted Successfully in Thread:" << std::this_thread::get_id() << std::endl;
55 
56     };
57     Sleep(1000);
58 
59     return 0;
60 }

Main()函数中test1回调无法执行!

问题分析:

CreateTimerQueueTimer和DeleteTimerQueueTimer 分别负责线程的开启和中止,函数定义如下:

BOOL CreateTimerQueueTimer(
  [out]          PHANDLE             phNewTimer,
  [in, optional] HANDLE              TimerQueue,
  [in]           WAITORTIMERCALLBACK Callback,
  [in, optional] PVOID               Parameter,
  [in]           DWORD               DueTime,
  [in]           DWORD               Period,
  [in]           ULONG               Flags
);
BOOL DeleteTimerQueueTimer(
  [in, optional] HANDLE TimerQueue,
  [in]           HANDLE Timer,
  [in, optional] HANDLE CompletionEvent
);

主线程中分别利用CreateTimerQueueTimer开启后台线程调用回调test()和test1(),并在test()调用中结束调用。由于DeleteTimerQueueTimer中CompletionEvent中使用的是INVALID_HANDLE_VALUE,导致线程会等待所有timer线程执行结束,才能返回。而当前执行回调的线程等不到自己结束,陷入死锁。因为CreateTimerQueueTimer的Flag参数使用的是WT_EXECUTEINTIMERTHREAD,导致test1回调和test使用的是同一线程,而test线程已经死锁,所以test1也无法得到执行

解决方案:

  1. 不应该在回调中调用DeleteTimerQueueTimer中止线程
  2. 如果必须在回调中中止线程,CompletionEvent应设为NULL,标记当前线程结束后,直接返回0(执行失败),回调执行完,不再继续执行
  3. CreateTimerQueueTimer使用Flag WT_EXECUTEDEFAULT开启新线程,即使上一个timer线程死锁,第二个线程仍可以执行

 

翻译

搜索

复制

标签:HANDLE,Windows,API,线程,CreateTimerQueueTimer,test,DeleteTimerQueueTimer,回调
From: https://www.cnblogs.com/stephen2023/p/17659221.html

相关文章

  • 商品详情api接口的应用方向有哪些?
    商品详情API接口的应用方向非常广泛,可以应用于以下领域:电子商务平台:商品详情API接口可以提供商品的基本信息,如名称、描述、价格、图片等,帮助电子商务平台展示和推荐商品。此外,还可以提供商品的库存信息、销售数据、评论信息等,帮助平台进行数据分析和管理。零售电商APP:商品详情API接......
  • 跨境电商需要用到的电商API详解(淘宝京东拼多多1688API)
    随着电子商务的快速发展,跨境电商已经成为越来越多企业的选择。在跨境电商的业务流程中,电商API发挥着至关重要的作用。本文将详细介绍跨境电商需要用到的电商API,包括商品信息、商品类目信息、店铺信息、交易明细信息、商品管理、评价信息、店铺用户信息等。一、商品信息API  获......
  • 京东上货软件必备API(商品主图价格详情批量下载上传)
    一、引言在数字化快速发展的今天,电商平台的商品信息管理变得尤为重要。本文将重点介绍京东上货软件必备的API接口,帮助你实现商品主图、价格、详情的批量下载与上传,提高商品管理效率,优化用户体验。二、京东上货软件必备API  测试地址入口1、商品主图批量下载API通过此API接口,......
  • 商品详情api接口的应用方向有哪些?
    ​ 商品详情API接口的应用方向非常广泛,可以应用于以下领域:电子商务平台:商品详情API接口可以提供商品的基本信息,如名称、描述、价格、图片等,帮助电子商务平台展示和推荐商品。此外,还可以提供商品的库存信息、销售数据、评论信息等,帮助平台进行数据分析和管理。零售电商APP:商品......
  • Linux 相比 Windows 有何优势
    首先Linux属于专业系统,开源且大多免费(参注3),而Linux大多优势都来源于开源这个特性,但缺点也大多来源于此,因为开源所以可以任意添加与减少功能和代码,前提是你有能力这么做的话,而有能力从核心功能上进行添加或裁剪的公司全世界不多于100个(已经非常向多里说了,实际情况可能少于30个)。......
  • WebStorm2023 Windows激活教程(亲测有效)
    写在前面Webstorm目前已经更新到最新的2023.2版本了,许多小伙伴私聊问我,为啥之前2021.3.1的激活套路对新版本2023.2不管用了,是个什么情况?很显然,Webstorm官方发现了这种激活路数,新版本加入了更严厉的反制激活。所以说,小伙伴们激活成功了以后,尽量不要升级Webstorm,不然大......
  • windows 桌面GUI自动化- 18.pywinauto 保存控件菜单树结构print_control_identifiers(
    前言.pywinauto可以使用print_control_identifiers()方法打印控件菜单树结构,这对我们查找控件非常方便。print_control_identifiers()查看相关源码defprint_control_identifiers(self,depth=None,filename=None):"""Printsthe'identifiers'......
  • AppSpider Pro 7.4.054 for Windows - Web 应用程序安全测试
    AppSpiderPro7.4.054forWindows-Web应用程序安全测试Rapid7DynamicApplicationSecurityTesting(DAST)请访问原文链接:https://sysin.org/blog/appspider/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgappspider没有任何应用程序未经测试,没有未知风险......
  • Acunetix v23.7 (Linux, Windows) - 漏洞扫描 (Web 应用程序安全测试)
    Acunetixv23.7(Linux,Windows)-漏洞扫描(Web应用程序安全测试)Acunetix|WebApplicationSecurityScanner请访问原文链接:https://sysin.org/blog/acunetix-23/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org重要提示AcunetixPremium现在使用日历化版本......
  • Invicti v23.8 for Windows - 企业应用安全测试
    Invictiv23.8forWindows-企业应用安全测试InvictiStandard17Aug2023v23.8.0.41720请访问原文链接:https://sysin.org/blog/invicti/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgInvicti是一种自动化但完全可配置的Web应用程序安全扫描程序,使您能够扫......