0

考虑以下:

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.

例如,当我几个小时前第一次运行它时,一切都按预期运行。但在那之后,它总是抛出相同的错误消息,当然,我从来没有发现限制被打破的消息。

4

0 回答 0