重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VB.NET開発(イベントプロシージャはマルチスレッドですか?)
以前より.NETのWindowsフォームの業務アプリ開発してますが、基本的な質問をさせて下さい。
イベントプロシージャの実行処理は、本体スレッド(実行時のスレッド)とは別のスレッドで動作しているのでしょうか。

例えば、ボタンのクリックイベントに何かしらの重い処理があったとします。このクリックイベントの処理ではボタンの制御をしていないので、イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。この時、このボタンを3回押下して実行させると3つのスレッドが新規に作成されて実行していると考えて宜しいのでしょうか。

デリゲートやイベントに関するキーワードで検索して、いくつか資料を見たのですが、上記の疑問にぴったり合う解答がなく、質問させて頂きました。

業務アプリの開発で、今まで、あまりマルチスレッドなど意識せずやってきましたが、実は意識しなくても、マルチスレッドの開発をしていたことになるのでしょうか。

以前、VB6の開発もしておりました。
ちなみにVB6の場合も、イベントプロシージャはマルチスレッドで実行されていると考えて宜しいのでしょうか。

よろしくお願いします

A 回答 (3件)

DoEvents でイベントを処理すると、そのイベントが終わるまで


元の処理に戻って来ないでしょう?
サブプロシージャを呼び出したようなものです。
関数を呼び出すとスレッドが分かれますか?同時に実行されますか?
呼び出し側の処理が保留にされて、呼び出された関数の処理が先に
実行されます。

実行はあくまでシングルです。
    • good
    • 0
この回答へのお礼

よく理解できました。
ありがとうございました

お礼日時:2010/09/16 22:50

> イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。


でも押せないでしょ?

ボタン連打した時に、イベントプロシージャの処理が一通り終わり、もう一度
イベントプロシージャが走る場合があることに疑問を持っているなら、ウィンドウ
メッセージがキューに溜まってるからでしょう。アプリ内部の仕組みではなく、
ウィンドウの機能。広く言えばウィンドウを制御しているOSの機能です。

この回答への補足

すみません。
情報が不足しておりました。
ボタン押下のイベント処理の重い処理は、ループ中でSystem.Windows.Forms.Application.DoEvents();を実行しています。
それだと、処理中のボタンが押下可能だと思います。
処理中に押下可能でもマルチスレッドではないということでしょうか。

よろしくお願いします。

補足日時:2010/09/16 16:05
    • good
    • 0

コントロールのイベントは、メインスレッドで動作する。


ボタンイベントについては、以下の無限ループで再進入できないことが確認できる。
VB6も全く同じ。

Private Sub Button1_Click(~)
While True
End While
End Sub

この回答への補足

すみません。
情報が不足しておりました。
ボタン押下のイベント処理の重い処理は、ループ中でSystem.Windows.Forms.Application.DoEvents();を実行しています。
それだと、処理中のボタンが押下可能だと思います。

イベント=>デリゲート=>非同期処理のような勝手なイメージがあり、マルチスレッドだと勘違いしているだけでしょうか。
よろしくお願いします。

補足日時:2010/09/16 16:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!