2

我在尝试让我的应用程序在达到指定的执行时间后关闭时遇到问题。我创建了一个作业,设置了限制信息,为其分配了当前进程,但没有任何反应。我的代码:

SECURITY_ATTRIBUTES sa;
myJob = CreateJobObject(&sa, TEXT("oko"));
LARGE_INTEGER lint; 
lint.LowPart = 1;

JOBOBJECT_BASIC_LIMIT_INFORMATION jbli;
jbli.PerProcessUserTimeLimit = lint;
jbli.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME;
SetInformationJobObject(myJob, JobObjectBasicLimitInformation, &jbli, sizeof(jbli));

AssignProcessToJobObject(myJob, GetCurrentProcess());

我认为这会使我的应用程序在 100 纳秒后关闭,但没有任何反应。这里有什么问题?


经过几个小时的“乐趣”与 winapi 文档,我放弃了这种方法,只是创建了另一个带有标志的进程(这实际上对我的问题更方便):

NORMAL_PRIORITY_CLASS | CREATE_BREAKAWAY_FROM_JOB

并且可以将此类过程分配给作业。为了成功创建作业,我遵循了 Roger Rowland 的建议并明确设置了 SECURITY_ATTRIBUTES 结构的参数。默认安全属性(CreateJobObject 中的 NULL)的工作方式类似。

4

1 回答 1

3

一个问题可能在这里

LARGE_INTEGER lint; 
lint.LowPart = 1;

您定义 aLARGE_INTEGER并初始化LowPart,但不执行任何HighPart可能包含随机数据的操作(在 Release 构建中)。也许试试这个

LARGE_INTEGER lint; 
lint.HighPart = 0;
lint.LowPart = 1;

另一种可能性在这里

SECURITY_ATTRIBUTES sa;
myJob = CreateJobObject(&sa, TEXT("oko"));

因为你还没有初始化SECURITY_ATTRIBUTES结构。所以做这样的事情

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
myJob = CreateJobObject(&sa, TEXT("oko"));

如果其中一个或两个都没有效果,也许您可​​以相应地编辑您的问题,我会再想一想。您很可能需要更复杂的初始化SECURITY_DESCRIPTOR但从上面开始并检查所有错误返回。

于 2013-05-24T12:35:33.097 回答