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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
OpenCL

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

#1

投稿記事 by OpenCL » 14年前

こんにちは

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

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

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

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

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

#2

投稿記事 by naohiro19 » 14年前

戻り値あり、引数ありの宣言は以下になります。

コード:

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

コード:

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

コード:

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

OpenCL

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

#3

投稿記事 by OpenCL » 14年前

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

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

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

#4

投稿記事 by 沖 滉均 » 14年前

naohiro19さん
本件、質問者さんはDLLの呼び出し方を聞いているわけではないと思いますが
naohiro19さんの回答はDLLの呼び出し方法ですよね?
今回に限らず内容と不一致な回答が目立つように思います。
質問の意図を違って捉えてしまった結果というのであれば多少は仕方ないと思いますが、
あまり意味の合わない返答をするのは荒らし行為と変わらないと思いますのでやめた方が
良いのではないでしょうか?
There is no royal road to learning.
codeタグで指定できる言語
画像

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

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

#5

投稿記事 by YuO » 14年前

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

OpenCL

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

#6

投稿記事 by OpenCL » 14年前

YuOさん
ご教授ありがとうございます
さっそくですが、

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

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

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

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

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

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

#7

投稿記事 by YuO » 14年前

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

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

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

OpenCL

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

#8

投稿記事 by OpenCL » 14年前

丁寧なご指導本当にありがとうございます。

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

問題を少し詳しく説明させていただきます。
######################################################################
#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する場合は?

#9

投稿記事 by softya(ソフト屋) » 14年前

前にもYuOさんが説明していますが、マルチスレッドがC/C++のDLL内で完結している(C/C++だけで記述してある)なら問題ないですが、C/C++内のスレッドからVB6のサブルーチンなど呼び出すとVB6がマルチスレッドに対応していないので致命的なバグになると言うことです。

上記の条件を守っている限り#1から#5まで問題ありません。
並列処理のコードは当然ながらC/C++で記述する必要があります。
VB6はDLLを呼び出してのSTARTやSTOPやRESTARTなどの制御、結果の受け取りだけが可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

OpenCL

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

#10

投稿記事 by OpenCL » 14年前

皆さん
大変助かりました。
この掲示板に出会ってよかった!

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

閉鎖

“C言語何でも質問掲示板” へ戻る