web-dev-qa-db-ja.com

Windowsプログラムはいつ実行を一時停止しますか?

Windowsで無人で長期間実行する必要があるアプリがありますXPおよび7。LogMeInを備えたリモートマシンで実行しています遠くからでも見ることができるようにインストールされています。プログラムには、タイマーによってペースが調整される定期的なロギングタスクがあります。

少し遅れてPCがスクリーンセーバーに設定されていて、スクリーンセーバーの終了時にユーザーログイン画面を表示すると、PCがスクリーンセーバーに入るとアプリが機能しなくなることに気づきました。

リモートでログインしてスクリーンセーバーから追い出すと、中断したところから続行しますが、その間にデータが記録されません。

スクリーンセーバーオプションの[再開時にウェルカム画面を表示する]チェックボックスをオフにすることで解決したと思いましたが、問題は再び発生したようです。スクリーンセーバーを完全に無効にしてみましたが、うまくいきませんでした。

プログラムが常に実行されていることを確認するにはどうすればよいですか?ウェルカム画面でWindowsから「x個のプログラムが実行中」と表示されますが、Windowsタイマーには拡張されていないようです。少なくとも時々。


詳しくは:

いくつかのデバッグコードを追加し、もう少し情報があります。

このアプリはDelphi2006GUIアプリです。それが行う通常のタスクの1つは、レポートを生成することです。レポートが生成されている間(時間がかかる場合があります)、進行状況バーが表示されます。これは、すべての処理がOnPaintハンドラーで行われるモーダル形式として実装されます。

スクリーンセーバーが起動した後にレポートがトリガーされ、[再開時にウェルカム画面を表示する]チェックボックスがオンになっている場合、このモーダルフォームのOnPaintメソッドは起動しないことがわかりました。フォームのOnShowイベントが発生し、アプリがハングします。スクリーンセーバーを起動して再開するとすぐに、OnPaintイベントが実行され、すべてが発生します。

スクリーンセーバーがアクティブなときにタイマーイベントが発生しないという私の当初の想定は間違っていました。実際、タイマーイベントの再入を防ぐための他のコードは、レポートが終了するまで何も起こらないようにし、レポートはOnPaintイベントに引っ掛かりました。

PCがウェルカム画面に画面保存されたときに実行されるようにこの進行状況フォームを実装する方法に関する提案はありますか?

6
rossmcm

プログラムをサービスとして実行するように設定できます。このようにして、常にバックグラウンドで実行されます。
そうすれば、システムをロックしても、アプリケーションは引き続き実行されます。
無料ツール Servify This はあなたのニーズに完全に合うでしょう。

Servifyをダウンロード

4
Joe Taylor

この考え方についての質問には十分なデータがありません。
それで、私はあなたが答えをさらに読むために最初に断言できるいくつかの仮定から始めます。

  1. ターゲットマシンで何らかのドメインログインを使用していますか?
  2. スクリーンセーバーは通常、システムがロックされると起動します
  3. 一部の構成では、システムがロックされている間にユーザーログインが失われます
    (ここでは正確な概念を思い出せませんが、リモートでログインした場合に発生する可能性があります)
    要するに、セッションが終了する可能性があります...
  4. 最後に、プログラムでネットワーク接続(またはログインにのみ許可されるリソース)が必要な場合、セッションが終了すると、これらのアクセスが取り消される可能性があります。
    これにより、このような状況ではアプリケーションを完了できなくなります。

したがって、これが当てはまる場合、(セッションの終了時に)アクセスが取り消されたためにアプリケーションがアクティビティを完了できず、システムを「ロック解除」するために再度ログインすると、セッションが再開され、アプリケーションも再起動できます(結果に到達せずにタイムアウトして停止した可能性があります)。ただし、新しいセッションを実行しているため、正常に再開されます(ただし、実行したままにすると同じ問題が発生し、最終的にセッションが終了して画面がロックされます)。

2
nik

これはもっとハックされた解決策のように聞こえるかもしれませんが、数分ごとにマウスをTwitchに少しコードを追加するだけではいけませんか?大きな問題はありません。いずれかの軸の現在のマウス位置に1を加算し、1を減算するだけです。

0
Freesnöw

私が採用しなければならなかった最終的な解決策は、FormActivateハンドラーで処理を行うことでした。次に、Closeハンドラーが呼び出されるまで、OnPaintメソッドは機能しないため、メッセージを投稿してフォームを閉じる必要がありました。 OnPaintイベントとは異なり、OnActivateイベントis PCがスクリーンセーバーにあるときに呼び出されます。

procedure TReportForm.FormShow (Sender: TObject) ;
begin
OnActivate := FormActivate ;      // reinstate the handler (it will be nil from any prior call)
end;

procedure TReportForm.FormActivate (Sender: TObject) ;
begin
OnActivate := nil ;               // prevent it being called recursively
GenerateReport ;
PostMessage (Handle, WM_CLOSE, 0, 0) ;
end ;
0
rossmcm