質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

14862閲覧

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

k47

総合スコア12

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/09/01 07:09

編集2016/09/03 12:32

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

投稿2016/09/01 07:58

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k47

2016/09/02 02:14

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

0

ベストアンサー

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

2の処理が重い場合(画面が応答なしになるような)、1や3の処理に影響が出るのでしょうか?

それぞれのシステムは、タイマーで指定時間になった時、 タイマー停止→処理開始→タイマー開始
の順になっています。

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

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

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

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

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

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

投稿2016/09/03 03:57

Tipo

総合スコア239

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k47

2016/09/03 12:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問