4

私はバックグラウンドで24時間年中無休でPC上で実行され、何らかのアクションを実行する必要があるかどうかを確認し、30分待ってからもう一度確認するなどのdelphiアプリケーションを実行しています。

常に実行されているためにアプリケーションがCPUまたはメモリを過負荷にしないようにするにはどうすればよいですか。

4

7 に答える 7

14

30分ごとに実行するタイマーを作成し、そこからチェック/アクションを呼び出します。そうすれば、何もすることがないときにアプリケーションをアイドル状態にすることができます。

または、これを行うために定期的に実行するスケジュールされたタスクを作成することもできます。

于 2010-05-13T19:19:42.003 に答える
5

タイマーに関する答えは良い解決策であり、私はこれを追加します。タイマーイベントまたは呼び出される後続のプロシージャがビジー状態をチェックすることを確認します。つまり、ウェイクアップする場合は、新しいバッチを開始する前に、最後のバッチが完了していることを確認してください。これは、物事が順調に進んでいるときに見逃しがちです。その後、深夜に何か悪いことが起こったために、物事がバックアップされ、システム全体が午前8時にログジャムになり、16の呼び出し(またはスレッド)がスタックされる状況になります。 、プロセスなど)。

したがって、タイマーイベントを次のように記述します。

OnMyTimer...
begin
  MyTimer.Enabled := false;
  try
    DoSomethingForALongTime;  // Usually runs in 45 seconds, but sometimes takes 45 minutes!
  finally
    MyTimer.Enabled := true;  // and (SomeAbortRequest = False) and (SomeHorribleErrorCount = 0);  
  end;
end;
于 2010-05-13T19:41:04.620 に答える
1

タイマーに関する答えは、まさにあなたが探しているものです。CPUまたはメモリを過負荷にしないことについての質問については、タスクマネージャでプログラムを確認してください。何もしていないときは、メモリの「定常状態」にあり、それ以上割り当てず、CPU時間の1%以下を使用している必要があります。

ほとんどのプログラムを長期間アイドル状態にしておくのは安全です。VCLは、CPUリソースを占有せずにアイドリングを処理する方法を知っているので、タイマーを使用して、適切なタイミングでウェイクアップしてイベントをアクティブ化する必要があります。

于 2010-05-13T19:26:08.463 に答える
0

ほとんどのプログラミング言語には「スリープ」関数があり、これを呼び出してプログラムの実行を停止させることができます。

あなたはメモリ使用量を管理しています。寝る前に記憶の割り当てを解除し、目覚めたときに再割り当てすることができますが...

定期的なジョブを設定する方がよい場合があります。これを行う方法はわかりませんが、Windows Scripting Hostを使用して、任意のスケジュールでアプリケーションを起動する方法があると思います。

于 2010-05-13T19:17:35.190 に答える
0

非アクティブの絶対状態を強制したい場合は、「スリープ」機能を使用できると思います。再起動時にどのように動作するかはわかりませんが。(Windowsはアプリケーションが応答しないと報告すると思います。)

アプリケーションにメインフォームがなく、トレイに座っているだけの場合(または完全に見えない場合)、それはあまり効果がありません。メインメッセージループは、OSから受信するすべてのメッセージを処理しますが、多くを受信するべきではありません。そして、受信するいくつかのメッセージは、それらを処理する必要があります(シャットダウンメッセージ、システムパラメータ変更通知など)

したがって、タイマーを設定するだけで、プログラムを強制的にアイドル状態に保つためのコードの設定を忘れることができると思います。

そのプロセスアクティビティを本当に最大に制限したい場合は、タイマーのイベントに出入りするときにスレッドの優先度を設定できます。したがって、イベントに入るときは優先度を「通常」に設定し、イベントから出るときは「低」に設定します。

于 2010-05-13T19:46:38.417 に答える
0

わかりませんでしたが、アプリケーションが複数のスレッドを使用している場合、OSがプロセスに費やすCPUの量が増える可能性があります(たとえば、タイムスライスやスレッドスイッチを調べてください)。

OSは、メモリページの一部をスワップアウトする場合もあるため、メモリの使用量を減らしたり、「待機時間」でのメモリアクセスを減らしたりすることも役立ちます。

したがって、スレッドを1つだけ使用し、追加のメッセージループもない場合は、Sleep()を呼び出すだけでよい方法です。これにより、OSに、長い間タイムスライスがまったく必要ないことが通知されます。来て。

YieldThread()/ SwitchToThread()と独自の時間管理(たとえばNow()を使用)は避けてください。これは、多くのスレッド切り替えが行われていることを意味するため、何もしません。

もう1つの方法は、タイムアウトが大きいWaitForMultipleObjectsを使用して、アプリケーションが引き続きメッセージに応答できるようにすることです。

于 2010-05-17T08:28:48.613 に答える
0

サービスアプリケーションを作成し(スタートアップの種類を自動に設定)、タイマーとしてCreateTimerQueueTimerを使用することをお勧めします。メモリリークは、メモリ要件/プーリングクラスを予約することで軽減できます。

于 2010-05-26T12:05:44.100 に答える