質問: 現在、WindowsServer2008で、VB.NETで作成した以下のシステム(exe)を起動しています。 1.Oracle11gからデータを取得してテキストに出力するシステム 2.テキストから取得したデータをOracle11gに登録するシステム 3.Oracle11gからデータを取得してラベルプリンタ(レスプリ)からラベルを出力するシステム 1と2についてはそれぞれ1つのプロセスとして起動していますが、 3に関しては一つのexeでプリンタ台数分起動します。(プロセスが8あります) 上記のシステムは全て起動している状態で、タイマーを使用して定期的に処理が実装されます。 時間間隔はそれぞれ異なります。 問題は、3のシステムでラベルが出てこないという現象が発生していることです。 それも常にではなく、2の処理が重くなる時間帯に発生しているようなのですが、 2の処理が重い場合(画面が応答なしになるような)、1や3の処理に影響が出るのでしょうか? 自分の中では別のプロセスで動いている以上、それぞれ別で処理されると考えていたのですが、 この考えは間違っているのでしょうか? それぞれのシステムは、タイマーで指定時間になった時、 タイマー停止→処理開始→タイマー開始 の順になっています。処理が終了しないとタイマーは開始しない状態です。 ラベルが出てこないという現象を回避するために、DoEventsの処理を組み込んだ場合、 それぞれのシステムに影響があるのでしょうか? DoEventsを調べたりすると、マルチスレッドにする方がいいと書かれている記事が目に留まるのですが、マルチスレッドにした方がいいのでしょうか? 質問が的を射てないかもしれませんが、よろしくお願いします。 言語:VB2010 -追記(問題ほぼ解決)- 回答頂きありがとうございました。 上記の問題、別に原因がありました。 3の処理で、印刷データをDBから取得し、印刷後、同じデータを印刷しないように印刷済みとして更新しているのですが、この時のデータ特定の条件が甘く、複数件更新してしまっていました。 この為印刷されないデータが発生していました。 1ヶ月程稼動していて顕著に現象が出たのはこれが初めてで、システムの更新をした直後だったので変更した部分が原因だと思っていたのですが、今回の現象はいつ起きてもおかしくなかった事でした。 問題は自己解決ですが、聞きたかったDoEventsとマルチスレッドについて回答していただいた方をベストアンサーとさせて頂きました。 ありがとうございました。
回答: マルチスレッドの開発経験がありますので、ご参考まで回答させて頂きます。 > > 2の処理が重い場合(画面が応答なしになるような)、1や3の処理に影響が出るのでしょうか? > > それぞれのシステムは、タイマーで指定時間になった時、 タイマー停止→処理開始→タイマー開始 > > の順になっています。 > > > タイマーの判定条件にもよりますが、次のようなケースが考えられます。 ・指定時刻(何時何分)か判定後、起動している場合 : 2の負荷により指定時刻中にタイマー処理が走らず、起動タイミングを逃した。 ・指定間隔(何分後)で起動している場合 : 2の負荷によりタイマー処理が遅れて走り、起動間隔が長くなった。 どちらにしても2の高負荷により、他の処理が割り込めなくなったと考えられますので、 DoEvents 等で、割り込みさせるタイミングを作るわけですが、タイマー処理や DoEvents を組み合わせると動作が不確実になりやすく、マルチスレッドを勧める 書き込みはこの理由もあると思われます。 今回のケースでは各処理が別プロセスとして分離されていますので、マルチスレッドに するまでの必要性は感じられませんが、System.Threading.Thread.Sleep により 明示的に他の処理に割り込ませる時間を指定してやれば、改善するのではないでしょうか。 2 の処理で複数件数を処理しているとしたら、10件おき等の単位毎に Sleep を入れて やれば、画面が応答なしになることも無く、3 の印刷処理も並行処理されると思われます。 (何度か試行して他の割り込みが出来るまでSleepの時間を大きくしていきます)