ページ 11

VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月20日(月) 13:20
by OpenCL
こんにちは

マルチスレッド対応しないVB6.0からVCで作ったmulti threadを制御する関数を呼び出す場合、
multi threadの機能を果たすことは可能でしょうか。

環境:
Visual Studio 2010
Winows 7, 64bit
CPU AMD Opteron 12 Core 64bit

ご存知の方宜しくお願い致します。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月20日(月) 14:13
by naohiro19
戻り値あり、引数ありの宣言は以下になります。

コード:

Declare Public Function DLLの関数名 Lib "DLLファイル名" Alias (引数)
戻り値なし、引数ありの宣言は以下になります。

コード:

Declare Public Sub DLLの関数名 Lib "DLLファイル名" Alias (引数)
戻り値なし、引数なしの宣言は以下になります。

コード:

Declare Public Sub DLLの関数名 Lib "DLLファイル名" Alias ()
これをプログラムの先頭で宣言すると呼び出すことができます。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月20日(月) 15:55
by OpenCL
さっそくご返答ありがとうございます。
気になるのはVBがsingle thread で、DLL中の関数はmulti thread で実行されるように設計されている場合、どうなるでしょうか。ほんとうに multi thread の機能を実現できるどうか疑問ですね。
要はは、single threadでmulti thread 関数をコールする場合、multi threadになるかどうかという質問ですね。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月20日(月) 16:49
by 沖 滉均
naohiro19さん
本件、質問者さんはDLLの呼び出し方を聞いているわけではないと思いますが
naohiro19さんの回答はDLLの呼び出し方法ですよね?
今回に限らず内容と不一致な回答が目立つように思います。
質問の意図を違って捉えてしまった結果というのであれば多少は仕方ないと思いますが、
あまり意味の合わない返答をするのは荒らし行為と変わらないと思いますのでやめた方が
良いのではないでしょうか?

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月20日(月) 17:40
by YuO
OpenCL さんが書きました:マルチスレッド対応しないVB6.0からVCで作ったmulti threadを制御する関数を呼び出す場合、
multi threadの機能を果たすことは可能でしょうか。
「機能を果たす」というのが何を意味するのかが不明ですが,それを無視して……。
  • VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない (e.g. Win32 APIの呼び出し)
  • VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば,大原則として問題ない (DllMain相当の中で変なことをすると問題になりますが,VB6がどうなるかはわかりません)
  • VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば,保証されない (AddressOfで渡したコールバック関数が別スレッドで呼び出された場合等)
「VB6」という文字列を「マルチスレッドに対応していないモジュール」と一般化できるかもしれません。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月21日(火) 09:17
by OpenCL
YuOさん
ご教授ありがとうございます
さっそくですが、

> VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない ...
これはマルチコアが「並列」に動くという意味でしょうね。

> VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば....
この中の「完結」という表現は諸スレッドが全部「killed」と理解すれば宜しいでしょうか。

> VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば...
もう少しご説明お願いできないでしょうか。非常に重要な事だとだけは認識していますが、

また宜しくお願い致します

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月21日(火) 12:43
by YuO
OpenCL さんが書きました:> VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない ...
これはマルチコアが「並列」に動くという意味でしょうね。
違います。どこからマルチコアとか並列とかの話が出てきたのか不思議ですが……。

DLL関数がマルチスレッド対応であっても,VB6のアプリケーションからの呼び出しで何らかの問題が起きることは無い,ということを言っています。
ここにおける「マルチスレッド対応」という言葉の定義ですが,
呼び出し側がマルチスレッド化されている場合に,DLLの関数を同時に呼び出しても誤動作しないならばその関数は「マルチスレッド対応」です。
DLLが単一状態しか持てず,状態が変化するような場合はマルチスレッド対応ではありません。
OpenCL さんが書きました:> VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば....
この中の「完結」という表現は諸スレッドが全部「killed」と理解すれば宜しいでしょうか。
DLLを使う側が,内部でスレッドを使っているのかどうかを意識する必要があるかどうか,という問題です。
完結しているというのは,スレッドを使っていることをプログラムを作る上で意識する必要がないことを意味しています。

例えば,複数のI/Oをそれぞれのスレッドを立てて実行し,元のスレッドはそれらのスレッドの終了を待って結果を関数が返すような場合,
外から見ると中でスレッドを使っていることを意識する必要はありません。
OpenCL さんが書きました:> VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば...
もう少しご説明お願いできないでしょうか。非常に重要な事だとだけは認識していますが、
VB6が作成したスレッドとは別スレッドでVB6のコードが呼ばれる状態です。
DLL内部でスレッドを作成し,時間がかかる処理をそのスレッドに委譲したときに,その処理終了時に渡されたコールバックルーチンを呼び出すような実装が相当します。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月21日(火) 15:27
by OpenCL
丁寧なご指導本当にありがとうございます。

ただし、大変申し訳ございません! 私が問題説明不足で、誤解された処があったような気がします。
本当に申し訳ないです!!

問題を少し詳しく説明させていただきます。
######################################################################
#1.マルチスレッドでマルチCPUコアを利用して「並列処理」を行いたいです。
#2.ところが、これまで利用しているVB6(などの言語)がマルチスレッドの機能がないため、
今考えているアイディアとして、VC++を使ってDLLを作成します。
#3.そのDLL中の関数でマルチスレッドを生成し、マルチCPUコアを操って、「並列処理」を行います。
#4.それから、VB6から上述マルチスレッドを生成するDLL関数をコールして、「並列処理」を実現します。
#5.できれば、DLL中のマルチスレッドの実行をバックグラウンドで行い、
    VB6より(マルチスレッド制御専用のDLL関数を通じて)DLL中のスレッドをstopさせたり、restartさせたりしたいです。
######################################################################

もし、上述考え方が実現可能ならば、条件やテクニック等、アドバイスお願いできれば幸いです。

どうぞ宜しくお願い致します。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月21日(火) 16:11
by softya(ソフト屋)
前にもYuOさんが説明していますが、マルチスレッドがC/C++のDLL内で完結している(C/C++だけで記述してある)なら問題ないですが、C/C++内のスレッドからVB6のサブルーチンなど呼び出すとVB6がマルチスレッドに対応していないので致命的なバグになると言うことです。

上記の条件を守っている限り#1から#5まで問題ありません。
並列処理のコードは当然ながらC/C++で記述する必要があります。
VB6はDLLを呼び出してのSTARTやSTOPやRESTARTなどの制御、結果の受け取りだけが可能です。

Re: VBからマルチスレッドDLLをCALLする場合は?

Posted: 2011年6月21日(火) 18:26
by OpenCL
皆さん
大変助かりました。
この掲示板に出会ってよかった!

心からお礼を申し上げます。