考虑以下:
void SomeClass::associateCompletionPort(HANDLE hJob) {
JOBOBJECT_ASSOCIATE_COMPLETION_PORT jacp = { 0 };
jacp.CompletionKey = hJob;
jacp.CompletionPort = hCompletionPort;
if (!SetInformationJobObject(
hJob,
JobObjectAssociateCompletionPortInformation,
&jacp,
sizeof(jacp))) {
// open a 'pop-up' with an error message, of the last error encountered.
dumpLastError(TEXT("SetInformationJobObject"));
}
}
1.hCompletionPort
被初始化,在 的构造函数中SomeClass
,像这样:
SomeClass::SomeClass() :
hCompletionPort(CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1)) {
if (!hCompletionPort) {
dumpLastError(TEXT("CreateIoCompletionPort"));
}
}
2.hJob
是“包含”一个进程的作业对象的句柄;3.该方法被多个Job Object调用,因此在将Job关联到Completion Port时存在一对多的映射关系;
注意:这是我用来在每次超出/破坏某个限制时获取消息的一些代码的一部分,稍后。
我通过在运行这个特定片段之前启动有问题的进程(每个限制到一个作业对象)来测试这一点。
问题:
每次将作业对象与完成端口关联时,关联都会失败,并显示:
SetInformationJobObject 失败,错误 87;参数不正确。
但最尴尬的是,在极少数情况下,一切正常。我可以确认这一点,因为我在代码的其他部分(我调用GetQueuedCompletionStatus
.
例如,当我几个小时前第一次运行它时,一切都按预期运行。但在那之后,它总是抛出相同的错误消息,当然,我从来没有发现限制被打破的消息。