- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在研究 Windows 的(新的?)线程池 API。我一直在关注 Using the Thread Pool Functions 中的示例我一直在仔细研究 MSDN 上的 API。关于清理组,我有些不明白。
调用 SetThreadpoolCallbackCleanupGroup()
时,第三个参数描述为
The cleanup callback to be called if the cleanup group is canceled before the associated object is released. The function is called when you call
CloseThreadpoolCleanupGroupMembers()
.
如果我的理解是正确的,这意味着您可以取消挂起的工作/io/timer 项目并要求它对这些对象中的每一个调用清理回调函数而不是最初的队列工作/io/timer 项的回调。这听起来很酷,我想使用它。
不幸的是,MSDN 上没有记录用于相关回调的 PTP_CLEANUP_GROUP_CANCEL_CALLBACK
类型,相关示例未使用此功能。
将法律掌握在自己手中,我将定义追溯到 WinNT.h
并发现了以下内容。
typedef VOID (NTAPI *PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(
__inout_opt PVOID ObjectContext,
__inout_opt PVOID CleanupContext
);
删除这个看起来很滑稽的声明中的废话会让你:
typedef void ( __stdcall * PTP_CLEANUP_GROUP_CANCEL_CALLBACK )
( void* ObjectContext, void* CleanupContext );
问题:如果您不得不进行有根据的猜测,您认为 ObjectContext
和 CleanupContext
指的是什么?
我的第一个猜测是 CleanupContext
是您在启动清理时指定的内容:因此是 CloseThreadpoolCleanupGroupMembers()
的第三个参数。我非常有信心这个猜测是正确的,因为 API 调用是如此直接相关。
我的第二个猜测是 ObjectContext
是您在提交 work/io/timer 项时指定的内容:这是 CreateThreadpoolWork()
的第二个参数等。我完全不确定情况是否如此。
有人可以确认这些猜测是正确的吗?有人用过这个功能吗?
最佳答案
您使用 SetThreadpoolCallbackCleanupGroup 函数指定的可选清理回调将针对与调用 CloseThreadpoolCleanupGroupMembers 时尚未关闭的同一回调环境关联的每个对象调用。回调的第一个参数,即对象上下文,是您在使用 TrySubmitThreadpoolCallback、CreateThreadpoolWork 等函数时指定的 void* 参数的值。回调的第二个参数,清理上下文,是您在使用 CloseThreadpoolCleanupGroupMembers 函数时指定的 void* 参数的值。
要记住的重要一点是,是否为特定对象调用清理回调与该对象是否具有未完成的回调无关。仅针对尚未关闭的对象调用它。换句话说,完全有可能调用对象的回调,然后为同一对象调用清理回调。
例如,如果您使用 CreateThreadpoolWork 函数创建了一个工作对象,并且在调用 CloseThreadpoolCleanupGroupMembers 之前未能调用 CloseThreadpoolWork 函数,那么将为该对象调用清理回调,即使该对象的回调已经执行。未能调用 CloseThreadpoolWork 不是错误,因为 CloseThreadpoolCleanupGroupMembers 将关闭与清理组关联的所有对象。
另一个需要注意的转折点是在使用 TrySubmitThreadpoolCallback 函数时。这是一个更简单的 CreateThreadpoolWork 版本,因为您不必考虑创建、提交和关闭工作对象。诀窍是线程池会在执行回调后自动关闭工作对象。这意味着只有在其回调仍未决且您在调用 CloseThreadpoolCleanupGroupMembers 以取消任何未决回调时指定 TRUE 时,才会为此对象调用清理回调。
关于c++ - 取消WIN32线程池中计划的work/io/timer项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220410/
我的程序有问题。 我有一个比较两个字符串的条件: (if (eq? (exp1) (exp2))) 当 exp1 给我一个字符串,exp2 给我一个字符串。可以肯定的是,当我更改“eq?”时到“=”,
我们有多种主要使用 GWT 开发的产品,目前由我们的最终客户使用。 想知道 GWT 的路线图。我得到了一些非官方的更新,谷歌正在将 GWT 中开发的产品转移到其他一些新技术。这是真的吗? GWT 的长
我希望每 15 分钟定期构建一次。我在网上看过,我正在使用这个时间表:*/15 * * * * Jenkins 告诉我使用 H/15 * * * * 来平均分配负载而不是 */15 * * * * 有
所以我正试图在 Scheme 中找出整个 call/cc 的东西。下面是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k)
所以我正试图在 Scheme 中找出整个 call/cc 的东西。下面是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k)
我们有一个 Azure WebJob,计划在 UTC 每天上午 8:00 运行(CRON - 0 00 08 * * *)。大多数时候它都会正确触发,但有时会触发两次(第二次运行)第一次运行后约 10
我是 Terraform 的新手。我正在尝试通过 azure 管道创建一个简单的存储帐户,但是当我运行我的管道时,我收到错误“太多命令行参数”。我很震惊,我不知道自己做错了什么。有人可以帮忙吗。 这是
我想在某些逻辑中间停止芭蕾舞 Actor 程序。如何使用代码停止 ballerina 中正在运行的程序?我正在寻找相当于 java 中的 System.exit(0) 的东西。 最佳答案 我相信您正在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
我们有一个 Azure WebJob,计划在 UTC 每天上午 8:00 运行(CRON - 0 00 08 * * *)。大多数时候它都会正确触发,但有时会触发两次(第二次运行)第一次运行后约 10
我是 Terraform 的新手。我正在尝试通过 azure 管道创建一个简单的存储帐户,但是当我运行我的管道时,我收到错误“太多命令行参数”。我很震惊,我不知道自己做错了什么。有人可以帮忙吗。 这是
我正在浏览 htdp 并在一开始的某个地方发现了这个:- Explain why the following sentences are illegal definitions: 1. (define
我正在使用 Laravel 开发成员(member)门户。 成员(member)资格有不同的类别,例如1) 单人2) 成人3) 家庭以及不同价格的所有类型。 我有一个 plans 表和 plans_s
我使用 DreamHost 作为我的网站的服务器,并且我尝试每天、每周和每月执行某个 MySQL 查询来更改我的网站的数据库。我开始在本地主机上使用事件调度程序,然后我发现我无法在 DreamHost
这周我的 crontab 作业发生了一个问题。 设置如下,每两周正常运行一次,直到现在。 10 06 * * 1 test $(($(date +\%W)\%2)) -eq 0 && echo 'te
编写了一个简单的脚本,它将在日志文件中写入日期时间戳,并且每次运行该脚本时,它都会附加到该日志文件中。 #!/bin/sh echo $(date) >> log.txt 当我尝试每 1 分钟安排一次
我对 PIPE 的了解是它用于单向通信,它有助于在两个相关进程之间进行通信。我从一本书中得到了下面的 PIPE 编程代码示例。我正在尝试使用 printf 理解代码并在代码的每一行之后打印出所有点。但
代码如下: (define make-simple-sv-num (lambda (delare) (let ((tal (random-from-to 100000 1000000)))
我目前正在使用“How To Design Programs”——使用 Scheme/Racket;我在 Scheme 的 R5RS 版本中遇到了一个非常奇特的功能。 在进行简单的减法时,尽管使用的是
我想确定时间表的详细信息。例如: 我有一个事件的时间表:event.schedule "Every 3 months on the 10th day of the month" 由哈希表示: {
我是一名优秀的程序员,十分优秀!