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

1つの問題はおそらくここにあります

LARGE_INTEGER lint; 
lint.LowPart = 1;

を定義しLARGE_INTEGERて初期化しますが、(リリース ビルドで) ランダム データを含む可能性があるLowPartものは何もしません。HighPart多分これを試してみてください

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 に答える