こんにちは
マルチスレッド対応しないVB6.0からVCで作ったmulti threadを制御する関数を呼び出す場合、
multi threadの機能を果たすことは可能でしょうか。
環境:
Visual Studio 2010
Winows 7, 64bit
CPU AMD Opteron 12 Core 64bit
ご存知の方宜しくお願い致します。
VBからマルチスレッドDLLをCALLする場合は?
Re: VBからマルチスレッドDLLをCALLする場合は?
さっそくご返答ありがとうございます。
気になるのはVBがsingle thread で、DLL中の関数はmulti thread で実行されるように設計されている場合、どうなるでしょうか。ほんとうに multi thread の機能を実現できるどうか疑問ですね。
要はは、single threadでmulti thread 関数をコールする場合、multi threadになるかどうかという質問ですね。
気になるのはVBがsingle thread で、DLL中の関数はmulti thread で実行されるように設計されている場合、どうなるでしょうか。ほんとうに multi thread の機能を実現できるどうか疑問ですね。
要はは、single threadでmulti thread 関数をコールする場合、multi threadになるかどうかという質問ですね。
Re: VBからマルチスレッドDLLをCALLする場合は?
naohiro19さん
本件、質問者さんはDLLの呼び出し方を聞いているわけではないと思いますが
naohiro19さんの回答はDLLの呼び出し方法ですよね?
今回に限らず内容と不一致な回答が目立つように思います。
質問の意図を違って捉えてしまった結果というのであれば多少は仕方ないと思いますが、
あまり意味の合わない返答をするのは荒らし行為と変わらないと思いますのでやめた方が
良いのではないでしょうか?
本件、質問者さんはDLLの呼び出し方を聞いているわけではないと思いますが
naohiro19さんの回答はDLLの呼び出し方法ですよね?
今回に限らず内容と不一致な回答が目立つように思います。
質問の意図を違って捉えてしまった結果というのであれば多少は仕方ないと思いますが、
あまり意味の合わない返答をするのは荒らし行為と変わらないと思いますのでやめた方が
良いのではないでしょうか?
Re: VBからマルチスレッドDLLをCALLする場合は?
「機能を果たす」というのが何を意味するのかが不明ですが,それを無視して……。OpenCL さんが書きました:マルチスレッド対応しないVB6.0からVCで作ったmulti threadを制御する関数を呼び出す場合、
multi threadの機能を果たすことは可能でしょうか。
- VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない (e.g. Win32 APIの呼び出し)
- VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば,大原則として問題ない (DllMain相当の中で変なことをすると問題になりますが,VB6がどうなるかはわかりません)
- VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば,保証されない (AddressOfで渡したコールバック関数が別スレッドで呼び出された場合等)
Re: VBからマルチスレッドDLLをCALLする場合は?
YuOさん
ご教授ありがとうございます
さっそくですが、
> VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない ...
これはマルチコアが「並列」に動くという意味でしょうね。
> VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば....
この中の「完結」という表現は諸スレッドが全部「killed」と理解すれば宜しいでしょうか。
> VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば...
もう少しご説明お願いできないでしょうか。非常に重要な事だとだけは認識していますが、
また宜しくお願い致します
ご教授ありがとうございます
さっそくですが、
> VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない ...
これはマルチコアが「並列」に動くという意味でしょうね。
> VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば....
この中の「完結」という表現は諸スレッドが全部「killed」と理解すれば宜しいでしょうか。
> VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば...
もう少しご説明お願いできないでしょうか。非常に重要な事だとだけは認識していますが、
また宜しくお願い致します
Re: VBからマルチスレッドDLLをCALLする場合は?
違います。どこからマルチコアとか並列とかの話が出てきたのか不思議ですが……。OpenCL さんが書きました:> VB6から,マルチスレッド対応であるDLL関数の呼び出しは問題ない ...
これはマルチコアが「並列」に動くという意味でしょうね。
DLL関数がマルチスレッド対応であっても,VB6のアプリケーションからの呼び出しで何らかの問題が起きることは無い,ということを言っています。
ここにおける「マルチスレッド対応」という言葉の定義ですが,
呼び出し側がマルチスレッド化されている場合に,DLLの関数を同時に呼び出しても誤動作しないならばその関数は「マルチスレッド対応」です。
DLLが単一状態しか持てず,状態が変化するような場合はマルチスレッド対応ではありません。
DLLを使う側が,内部でスレッドを使っているのかどうかを意識する必要があるかどうか,という問題です。OpenCL さんが書きました:> VB6から呼ばれたDLL中で作られたスレッドがDLL中で完結しているのであれば....
この中の「完結」という表現は諸スレッドが全部「killed」と理解すれば宜しいでしょうか。
完結しているというのは,スレッドを使っていることをプログラムを作る上で意識する必要がないことを意味しています。
例えば,複数のI/Oをそれぞれのスレッドを立てて実行し,元のスレッドはそれらのスレッドの終了を待って結果を関数が返すような場合,
外から見ると中でスレッドを使っていることを意識する必要はありません。
VB6が作成したスレッドとは別スレッドでVB6のコードが呼ばれる状態です。OpenCL さんが書きました:> VB6から呼ばれたDLL中で作られたスレッドがVB6のコードまで戻ってくるのであれば...
もう少しご説明お願いできないでしょうか。非常に重要な事だとだけは認識していますが、
DLL内部でスレッドを作成し,時間がかかる処理をそのスレッドに委譲したときに,その処理終了時に渡されたコールバックルーチンを呼び出すような実装が相当します。
Re: VBからマルチスレッドDLLをCALLする場合は?
丁寧なご指導本当にありがとうございます。
ただし、大変申し訳ございません! 私が問題説明不足で、誤解された処があったような気がします。
本当に申し訳ないです!!
問題を少し詳しく説明させていただきます。
######################################################################
#1.マルチスレッドでマルチCPUコアを利用して「並列処理」を行いたいです。
#2.ところが、これまで利用しているVB6(などの言語)がマルチスレッドの機能がないため、
今考えているアイディアとして、VC++を使ってDLLを作成します。
#3.そのDLL中の関数でマルチスレッドを生成し、マルチCPUコアを操って、「並列処理」を行います。
#4.それから、VB6から上述マルチスレッドを生成するDLL関数をコールして、「並列処理」を実現します。
#5.できれば、DLL中のマルチスレッドの実行をバックグラウンドで行い、
VB6より(マルチスレッド制御専用のDLL関数を通じて)DLL中のスレッドをstopさせたり、restartさせたりしたいです。
######################################################################
もし、上述考え方が実現可能ならば、条件やテクニック等、アドバイスお願いできれば幸いです。
どうぞ宜しくお願い致します。
ただし、大変申し訳ございません! 私が問題説明不足で、誤解された処があったような気がします。
本当に申し訳ないです!!
問題を少し詳しく説明させていただきます。
######################################################################
#1.マルチスレッドでマルチCPUコアを利用して「並列処理」を行いたいです。
#2.ところが、これまで利用しているVB6(などの言語)がマルチスレッドの機能がないため、
今考えているアイディアとして、VC++を使ってDLLを作成します。
#3.そのDLL中の関数でマルチスレッドを生成し、マルチCPUコアを操って、「並列処理」を行います。
#4.それから、VB6から上述マルチスレッドを生成するDLL関数をコールして、「並列処理」を実現します。
#5.できれば、DLL中のマルチスレッドの実行をバックグラウンドで行い、
VB6より(マルチスレッド制御専用のDLL関数を通じて)DLL中のスレッドをstopさせたり、restartさせたりしたいです。
######################################################################
もし、上述考え方が実現可能ならば、条件やテクニック等、アドバイスお願いできれば幸いです。
どうぞ宜しくお願い致します。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: VBからマルチスレッドDLLをCALLする場合は?
前にもYuOさんが説明していますが、マルチスレッドがC/C++のDLL内で完結している(C/C++だけで記述してある)なら問題ないですが、C/C++内のスレッドからVB6のサブルーチンなど呼び出すとVB6がマルチスレッドに対応していないので致命的なバグになると言うことです。
上記の条件を守っている限り#1から#5まで問題ありません。
並列処理のコードは当然ながらC/C++で記述する必要があります。
VB6はDLLを呼び出してのSTARTやSTOPやRESTARTなどの制御、結果の受け取りだけが可能です。
上記の条件を守っている限り#1から#5まで問題ありません。
並列処理のコードは当然ながらC/C++で記述する必要があります。
VB6はDLLを呼び出してのSTARTやSTOPやRESTARTなどの制御、結果の受け取りだけが可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。