- ベストアンサー
VBの実行シーケンスについて
お世話になります。 以下のような構造の場合 Sub1内の処理1が完了してから Sub2内の処理2が始まることは保証されるのでしょうか? また、Declareで定義したDLL呼出をCALLする場合、 CALLしたDLLの処理が終了するまでVBは待つのでしょうか? 基本的なところと思うのですが、開発したプログラムが不安なので、もしやと思い質問しました。 Sub Main() Sub1 Sub2 End End Sub Sub Sub1() 処理1 End Sub Sub Sub2() 処理2 End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
逆に、順番が保証されない例としては、イベントが絡んできた場合があります。 たとえば、 text1.text="aaa" call Sub1() call Sub2() とした場合、 text1_Changeがあったとしたら、これも連鎖で動きますが、その場合は直接呼び出されたわけではないので、text1_ChangeとSub1(Sub2)のどちらが先に実行されるかの保証はないはずです。 (実際デバッグとコンパイル後で動きが違うことがあった記憶があります。) あと、これはうろ覚えなんですが、ActiveXExeなど、別プロセスで実行されるもののメソッド実行についても順番の保証はされなかった記憶が…。
その他の回答 (3)
- piyo2000
- ベストアンサー率49% (144/293)
#1さんの仰るとおり、VBは基本的にシングルスレッドで動作します。 このような例の場合、 Sub1の中でSub2を呼んでいないのなら 「Sub2の実行はSub1の処理が全て終わってから実行される」ということは保証されます。 # Sub1がエラーなどでコケてしまうとSub2は実行されない可能性があるので # あえて「Sub1の後にSub2が実行される」とは言いませんが。。。 >Sub1とSub2をそれぞれStep交互に実行するのでは? これは#2さんが仰っているとおり、あり得ません。 逆に、VBでマルチスレッド的な処理をしたい場合に #3さんが仰っている、ActiveX Exeを使用します。 (ただしマルチスレッドではなくマルチプロセス) イベントも含めると、イベントに限りですが実行順は保証されません。(と記憶しています) 特にDoEventsを記述した場合がそうです。 ただSub1→Sub2という処理の流れは保証されます。 イベントに依存する処理を書いている場合(例えばキャンセルボタンなど)は きちんとコンパイルしたうえでテストすることとをオススメします。
お礼
ありがとうございます。 どうやらイベント絡みの話のようです。
- nnfuji
- ベストアンサー率28% (200/701)
>Sub1とSub2をそれぞれStep交互に実行するのでは?という話を聞いたので・・。 そんなことありません。 そんな動きをされたらプログラムが作りにくくてしょうがないです。 >Functionだと大丈夫なんだけど、Subだと駄目だと。 違いは、Function/Sub関数に戻り値があるかないかだけです。 関数を複数羅列して記述した場合は、基本的にバッチ処理になるので、2つ以上の関数を同時に実行る事はありません。ただ、呼び出した関数の中から別の関数を呼び出せば見た目上2つ実行しているように感じますが、PC(Program Counter)は一つしかありません。 C言語と同じ動きですので、C言語も勉強するとより理解が深まります。
- nnfuji
- ベストアンサー率28% (200/701)
基本的に、Sub,Functionの実行中に他の処理をすることはありません。VBは基本的にシングルスレッド処理です。 ブレークポイントを設定してステップ実行してみれば一目瞭然です。
補足
お世話になります。 Sub1とSub2をそれぞれStep交互に実行するのでは?という話を聞いたので・・。 デバックで1行づつ実行すると大丈夫なんだけど、コンパイルすると駄目だと・・。 Functionだと大丈夫なんだけど、Subだと駄目だと。 不確定な情報ですが、だとすると SubをFunctionにしなけりゃとか考えていたところです。
お礼
ありがとうございます。 イベント絡みの話のようでした。