VBはマルチスレッドでは動かない
  (C) 2001 A c t o r .N e t Soft Ware



 以下に公開するソースなどの著作は 篠田直樹 に復帰します。
原則として無許可で使用する事が出来ますが、ここに書かれている内容を
直リンクや引用などであたかも第三者が作成した様に見せたり如何なる事情でも金銭が発生する行為を禁止します。



VBはマルチスレッドで動いてはいません。
その証明となるソースを以下に示します。

ボックスとコマンドボタンを2つづつ配置して加算させてみます。
コマンドボタン1をクリックした後、続いて2をクリックしてみて下さい。
クリックされた最後のアクションが有効になり、前者で動いていた加算が停止してしまいます。
マルチスレッドが有効なら、コマンドボタンを2つ押しても双方のボックスに加算を続ける筈です。


Private Sub Command1_Click()
Dim x As Double

Do
DoEvents
x = x + 1
Text1.Text = x
Loop

End Sub

Private Sub Command2_Click()
Dim x As Double

Do
DoEvents
x = x + 1
Text2.Text = x
Loop

End Sub


これにはスレッドの概念が絡んできます。
VBにはプロジェクトを実行した際に一つのプロセスを作成します。
プロセスとは、アプリケーションを動かす為の領域確保です。
EXEを実行した時、メモリーにはこのプロセス領域を確保しているのですが
VBにはスレッドという概念がありません。

では、VBはなぜスレッドが作成できないのでしょうか。
マルチスレッドを実現するには制御機構が必要です。
そうなると、プロセスの中で制御を行なう必要があり、制御を行なうにはスレッドを作る必要があります。
スレッドとは、小さいプログラムを同時に動かす為の機構です。
VBの構造は単純にプログラムの固まりが点在していて、その中の一つを実行しているに過ぎません。

C言語にはこのプロセス領域の中にスレッドを作成出来ます。
即ち、Cにはプログラムを整理する機構が作れる事を意味します。
言及すると、VBには制御を行なう機構が無い為、デバイスを制御する様なプログラムは作成出来ません。
これがC言語との差とVBの限界と言われる由縁です。

ちなみにこれはwindowsの動きにも関係していきます。
windowsは一つのプロセスを作成すると通常は他人のプロセスの中身を見る事が出来ません。
アプリケーションが複数立ち上がるとOSは対象のアプリからの要求を待ち受けて
アクションに対する返答を返す動作を永遠に行ないます。
プログラム同士が何をしているのか情報を共有する事が出来ません。
例えるなら、OSは木の幹でアプリは葉っぱの様なもので、葉っぱ同士が結びついて光合成を行なう事はありません。
少なくとも、アプリ同士(プロセス間)で情報が共有する事が出来ないとなると、制御そのものが出来ません。
制御を行なうには立ち上がったアプリに対して、インデックスを貼り付けて、
インデックスから辿ってプロセスの中身を制御する必要があります。

勿論、VBでこんな芸当は出来ません、理由は制御が出来ないからです。
VCではこの制御が可能なのですが、かなりの技術力が必要でしかも実行するには危ない代物です。
例えば、この芸当を行なうにはリンク形式で複数のプロセスを参照する為、
どこかのプロセスに応答が無くなるとプロセスを監視したプログラムまで情報を待ち受けた状態で転けてしまいます。
又、プロセスを監視するソフトを落とす時、全プロセスに張ったインデックスを確実に削除する必要があります。



Copyright (C) 2001 A c t o r .N e t Soft Ware All Right Reserved