1

アプリケーションを作成する最良の方法は何だろうと考えていました。基本的に、マルチスレッドでさまざまなゲーム シミュレーションを同時に実行できるスポーツ シミュレーション プロジェクトがあります。

DateTime が添付された SQLite データベースに一致を保存します。

新しい試合をプレイする必要があるかどうかを 1 時間ごとに確認し、それらのスレッドを生成するアプリケーションを作成したいと考えています。

そのプロセスのさまざまなインスタンスが共有するオブジェクト(特にトーナメントオブジェクト)があり、DBに保存されたときに新しいプロセスによって上書きされると思われるため、タスクスケジューラがこれを毎時間実行することに依存することはできません. したがって、理想的には、何時間にもわたってスリープするある種の長時間実行プロセスを作成する必要があります。

各オブジェクトがメモリから 1 回だけ読み込まれるようにオブジェクト モデルを作成したので、すべてのシミュレーション スレッドがこの 1 つのアプリケーションから生成される限り、データを上書きすることはありません。

編集:要件の詳細

基本的に、複数のマッチを同時に実行できる必要があります。これらのマッチは任意の長さにすることができるため、一方が他方の開始前に終了する必要はありません (実際、ほとんどの場合、同時に複数のマッチが実行されます)。

私が思い描いているのは、バックグラウンドで実行されるプログラム (サービスだと思いますか?) で、60 分間スリープし、データベースをチェックして、ゲームを開始する必要があるかどうかを確認します。開始するゲームがある場合は、スレッドを起動してそれらのゲームをシミュレートし、スリープ状態に戻ります。したがって、シミュレーション スレッドは実行されていますが、「スケジューリング」スレッドはさらに 60 分間スリープ状態になります。

私がデフォルトの OS タスク スケジューリング インターフェイスを使用できない (と思う) 理由は、これらのインターフェイスでは、実行するタスクを新しいプロセスとして破棄する必要があるためです。私は、最初のロード時に各オブジェクト クラスによってキャッシュされる (メモリ参照) ようにデータベース オブジェクト モデルを開発しました。つまり、各オブジェクトはメモリから 1 回だけロードされ、その参照はすべての保存で使用されます。つまり、各シミュレーション スレッドが完了してその状態を保存すると、同じ参照が (更新された状態で) 状態を保存するために使用されます。毎回異なる実行可能ファイルが起動されると、おそらく各プロセスによって異なるメモリ参照が開かれるため、1 つのプロセスが DB に保存され、他のプロセスによって書き込まれた状態が上書きされる可能性があります。

サービスは道のりのように見えます。サービスを 60 分間スリープさせ、その後ウェイクアップして関数を実行する方法はありますか? これを標準のコンソール アプリケーションにするのはメモリを浪費する気がしますが、私が認識していない効率的な方法があるかどうかはわかりません。

4

2 に答える 2

2

本当に信頼できるものにしたい場合は、サービスにします。

しかし、それを通常の (コンソール、WinForms、WPF) アプリケーションにすることに問題はありません。

たぶん、要件を少し拡張できます。

于 2010-07-25T22:37:39.250 に答える
0

私がデフォルトの OS タスク スケジューリング インターフェイスを使用できない (と思う) 理由は、これらのインターフェイスでは、実行するタスクを新しいプロセスとして破棄する必要があるためです。データベース オブジェクト モデルを開発して、最初の読み込み時に各オブジェクト クラスによってキャッシュされるようにしました (メモリ参照)。つまり、各オブジェクトはメモリから 1 回だけ読み込まれ、その参照はすべての保存で使用されます。

すべてを永久にキャッシュしたままにしたい場合は、単純に永久に実行されるアプリケーションが必要です。これを Windows サービスまたは通常の Windows アプリケーションにすることができます。
Windows サービスは、サービス マネージャー API に準拠した通常の exe です。作成したい場合は、Visual Studio にスケルトン コードを自動生成するウィザードがあります。基本的に、メソッドを持つ代わりに、Mainメソッドを持つServiceクラスがあり、Run他のすべては同じです。

必要に応じて、Windows タスク スケジューラを使用してアクションをスケジュールできます。これを行う方法は、何もしないバックグラウンドで実行時間の長い Windows サービスを使用することです。TCP ソケットまたは名前付きパイプなどを開いて、そこに座ってください。次に、このソケットまたは名前付きパイプに接続し、バックグラウンド アプリにウェイクアップを指示する小さな「スタブ」exe を作成します。
もちろん、これはsleepバックグラウンド アプリケーションで実行するよりもはるかに困難ですが、より多くの制御が可能になります。バックグラウンド サービスを再起動せずにスリープ時間を変更したり、オンデマンドで実行したりできます。


ただし、あなたのデザインを検討します。長時間実行されるサービスに依存しているという事実は、大きな障害点です。アプリを何日も実行する必要があり、アプリをクラッシュさせるバグが 1 つある場合は、最初からやり直す必要があります。はるかに優れたアーキテクチャは、Unix モデルに従うことです。ここでは、開始、1 つのことを実行してから終了する小さなプロセスがあります (この場合、各ゲーム シミュレーションを独自のプロセスとして処理し、1 つが停止してもマスター プロセスを使用しません)。または他のシミュレーションをダウン)。

長時間実行しようとしている主な理由は、データベースクエリをキャッシュすることです。実際にこれを行う必要がありますか?多くの場合、データベースは十分に高速です (独自のキャッシュがあり、十分にスマートです)。プログラマーが犯すよくある間違いは、データベースのようなものは遅いと思い込んで、実際には問題ないのに最適化に時間を浪費することです。

于 2010-07-26T20:41:21.143 に答える