Vb.Net Application.DoEventsとマルチスレッドについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,685

k47

score 10

現在、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とマルチスレッドについて回答していただいた方をベストアンサーとさせて頂きました。
ありがとうございました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

DoEventsにするとか、マルチスレッドにするとかを考える前に、まずは原因究明からじゃないですかね。
とりあえず原因はわからないけどDoEventsにしたら動いた、とかそういうのは使う側からしたら怖すぎます…。

2で更新中には3でアクセスできないような排他がかかっているとかないんでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/02 11:14

    回答ありがとうございます。
    2の処理で更新中でも3でアクセスは可能です。3で参照しているテーブルは2とはことなるので。

    キャンセル

checkベストアンサー

0

マルチスレッドの開発経験がありますので、ご参考まで回答させて頂きます。

2の処理が重い場合(画面が応答なしになるような)、1や3の処理に影響が出るのでしょうか? 
それぞれのシステムは、タイマーで指定時間になった時、 タイマー停止→処理開始→タイマー開始 
の順になっています。

タイマーの判定条件にもよりますが、次のようなケースが考えられます。

・指定時刻(何時何分)か判定後、起動している場合 : 
2の負荷により指定時刻中にタイマー処理が走らず、起動タイミングを逃した。

・指定間隔(何分後)で起動している場合 : 
2の負荷によりタイマー処理が遅れて走り、起動間隔が長くなった。

どちらにしても2の高負荷により、他の処理が割り込めなくなったと考えられますので、
DoEvents 等で、割り込みさせるタイミングを作るわけですが、タイマー処理や
DoEvents を組み合わせると動作が不確実になりやすく、マルチスレッドを勧める
書き込みはこの理由もあると思われます。

今回のケースでは各処理が別プロセスとして分離されていますので、マルチスレッドに
するまでの必要性は感じられませんが、System.Threading.Thread.Sleep により
明示的に他の処理に割り込ませる時間を指定してやれば、改善するのではないでしょうか。

2 の処理で複数件数を処理しているとしたら、10件おき等の単位毎に Sleep を入れて
やれば、画面が応答なしになることも無く、3 の印刷処理も並行処理されると思われます。
(何度か試行して他の割り込みが出来るまでSleepの時間を大きくしていきます)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/03 21:22

    回答ありがとうございます。

    sleepで他の処理が割り込める時間を作る…ちょっと目からウロコな情報ありがとうございます。
    sleepでも割り込めるんですね…。
    基本DoEventsを使うと思っていたので…(・・;)
    参考にさせて頂きます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる