タイマーを待つためにデルファイアプリケーションをアイドル状態にする最も安全な方法は?

StackOverflow https://stackoverflow.com/questions/2829582

質問

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

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

役に立ちましたか?

解決

ほとんどのプログラミング言語には、プログラムが物事を停止させるために呼び出すことができる「睡眠」関数があります。

メモリの使用法を制御しています。あなたはあなたの記憶を眠りにつく前にあなたの記憶を扱うことができ、目を覚ましているときにそれを再割り当てすることができますが...

繰り返しの仕事を設定する方が良いかもしれません。これを行う方法はわかりませんが、Windows Scriptingホストには、必要なスケジュールでアプリケーションを起動する方法があると思います。

他のヒント

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

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

タイマーに関する答えは良い解決策です。これを追加します。タイマーイベント、またはその後の手順が忙しいことをチェックしてください。つまり、目を覚ます場合は、新しいバッチを開始する前に最後のバッチが完了していることを確認してください。これは、物事がうまく流れているときに見逃しやすくなり、その後、物事がバックアップされ、午前8時にシステム全体が午前8時にログジャムをログジャムする状況があります。 、プロセスなど..)。

このようにタイマーイベントを書く:

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;

タイマーについての答えは、まさにあなたが探しているものです。 CPUやメモリに過負荷にならないことについての質問については、タスクマネージャーのプログラムをご覧ください。何もしていない場合は、メモリの「定常状態」に座って、もう1%以下のCPU時間を使用する必要があります。

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

不活動の絶対状態を実施したい場合は、「睡眠」機能を使用できると思います。再起動でどのように動作するかはわかりませんが。 (Windowsはアプリケーションを反応しないと報告すると思います。)

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

ですから、タイマーを設定して、プログラムにアイドル状態を維持するようにコードを設定することを忘れることができると思います。

実際にそのプロセスアクティビティを最大に制限したい場合は、タイマーのイベントを入力/出るときにスレッドの優先度を設定できます。したがって、イベントに参加するときに「通常」に優先され、それを抜くときに「低」に設定します。

わかりませんでしたが、アプリケーションが複数のスレッドを使用している場合、OSがプロセスに費やすCPUの量に追加される可能性があります(たとえば、時間のスライスやスレッドスイッチを読み上げます)。

OSはまた、メモリページの一部を交換する可能性があるため、「待機時間」でメモリを使用したり、メモリアクセスを減らしたりすることもできます。

したがって、1つのスレッドのみを使用して追加のメッセージループもない場合、Sleep()を呼び出すだけで良い方法になる可能性があります。来て。

evereThread()/switchTothread()とあなた自身の時間維持(たとえばnow()を使用)を避けてください。

別の方法が使用することもできます waitformultipleObjects 大きなタイムアウトを使用すると、アプリケーションがメッセージに応答できるようにします。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top