もともとCで計算していたものを,DLLにしました。
VBから普通に呼び出せるようにまでできるようになったのですが,
できれば,結果だけでなく計算の進捗状況・途中結果なども知りたい思うようになりした。
どのようにすれば,このような機能を実装できるのでしょうか?
ちょっとした計算に使うためにプログラムを書く程度なので,
プログラミングやOSの仕様などはよくわからないのですが,
VBで受け取れるイベントのようなものをDLLから送出したりできるのかなぁ?
なんて考えて探してみたのですが,やはりよく分かりません。
VB側では結果を待機するループのようなものは回したくないので,
イベントとして受け取れればなぁ~と思ったのですが。
説明がへたくそ&PCやプログラミングに詳しくないため
質問の真意が伝わりにくかったかもしれませんが,
どんな些細なことでも結構ですので,解決法をご教授ください。
どうぞよろしくおねがいします。
No.1ベストアンサー
- 回答日時:
こんにちは、honiyonです。
方法は2つあります。
1.進捗を伝える関数を用意する。
2.進捗報告用のコールバック関数(機能)を用意する。
2は色々と難しいのですが、1は簡単に出来ると思います。
進捗報告関数は、今現在の計算具合を判断し、その結果を返します。
この関数をし、VBから一定時間ごとにその関数を呼び出す事で進捗具合を知ることが出来ます。
簡単な説明ですが参考になれば幸いです(..
早速のご回答ありがとうございます。
>1.進捗を伝える関数を用意する。
ですが,これは
「VB側(上司)から一定時間ごとにDLL側(部下)に進み具合を聞きに行く」
というイメージでよろしいでしょうか?
もしできることならば
「ある程度作業が進むたびにDLL(部下)がVB(上司)に進捗を報告する」
というようなイメージにしたいのですが…。
DLLがVBにイベントを送出できたらなぁ~という発想です。
>2.進捗報告用のコールバック関数(機能)を用意する。
ですが,ご想像の通り難しくて分かりません(笑)
でも,もしかしてこれが,ぼくがやりたいと思っていることなのでしょうか?
もしそうでしたら,よろしければアドバイス頂きたいのですが。
よろしくおねがいします。
No.5
- 回答日時:
今回は、VBでとのこと、がんばってください。
参考までに、下記のURL(「猫でもわかるプログラミ
ング」)のWindows SDK編72章に(DLLでやっていませ
んが)プログレスバーを出す例がありますので、
ご参考までに。
参考URL:http://www.kumei.ne.jp/c_lang/
No.4
- 回答日時:
具体的に、やり方は説明できないのですが、UNLHA32.DLLってDLL側で、プログレスバーを表示していますよね。
あのやりかたをすれば、VB側で処理しなくてもいいのではないでしょうか。
なんのたしにもなりませんね。
ごめんなさい。
ご回答ありがとうございます。
>UNLHA32.DLLってDLL側で、プログレスバーを表示していますよね。
>あのやりかたをすれば、VB側で処理しなくてもいいのではないでしょうか。
そうだったんですか…。知りませんでした。
確かに,使う立場からしたらありがたい機能ですね。
でも,DLLでユーザインターフェースを提供するのって,
なんだか難しそうですよね(笑)
ちなみに,僕はコンソールアプリしか作ったことがないので,
計算はC,ユーザインターフェースはVBという安易な発想になってしまいました。
いずれは,「自分でプログレスバーを表示するDLL」にも挑戦してみようと思います。
どうもありがとうございました。
No.3
- 回答日時:
こんにちは、honiyonです。
私の紹介した2の方法を実現するには、ポインタや関数について熟知している必要があります。 また、1から全部説明すると結構な量になるのでおおまかに説明します。
因みに、ここで紹介する方法は VBで出来るか分かりません(^^;
コールバック関数というのは、VBでいうイベントのようなものにあたります。
では、コールバック関数機能(?)を実装するかというと、
1.コールバック関数のポインタを取得する。
2.任意のタイミングで、取得したポインタを使ってコールバック関数を呼ぶ
以上です。
たったこれだけなのですが、実際にやろうとすると結構大変です。(ポインタ周りで)
別件ですが、大事な事を忘れていました。
#1の、1の方法にしろ2の方法にしろ、itohさんの仰るように非同期処理が必要になります。 これを実現するために、一般的には「マルチスレッド」というものを用います。 これもまた簡単そうでコールバック以上に難しい技術です。
計算処理を行いつつ、平行して進捗処理も行うために必要になります。
またかなりおおまかな回答ですが(^^;、参考になれば幸いです(..
再びのご回答ありがとうございます。
一度ならず,二度までも… 本当に感謝しております。
>私の紹介した2の方法を実現するには、…
「コールバック関数」というのは自分で作るのですね。
僕は計算用にコンソールアプリしか作ったことがないのですが,
WIN32-SDKとかを少しかじったときにCALLBACKというような
キーワードがあったように記憶していて,
「なにやら難しいもの」「SDKやMFCをやらなけりゃ縁のないもの」と
勝手に(笑)思い込んでおりました。
コールバックというのは,
「VB(上司)が進捗を管理する部署(コールバック関数)を設置し,
仕事を部下(DLL)に渡す際,
その部署への連絡先(コールバック関数のポインタ)を指示する」
というイメージでよろしいでしょうか?
まだ実際に試していないので定かではありませんが,
最近のバージョンではVBでも関数のポインタを渡せるようになったそうです。
では,さっそく実際につくってみようと思います。
ほんとうに,どうもありがとうございました。
No.2
- 回答日時:
こんにちは。
itohhといいます。>VBから普通に呼び出せるようにまでできるようになったのですが
これは、DLL内の関数を呼び出すと言うことですよね?
このDLL内の関数は、非同期で実行できるのでしょうか?
普通にと言われているところを見ると、例えば、ファイル入力関数のInput関数の
ように、入力が完了するまで関数が戻ってこないのですよね。
まず、非同期に実行できるようにDLL内の関数を作り替えなければなりません。
これは、マルチスレッドとかマルチプロセスと言われている作りにしなければ
いけないと言うことです。
その次に、計算途中でVBプログラムにメッセージを投げなければいけません。
VBプログラムでは、このメッセージを受け取ってイベントを発生させます。
このあたりの解説は、MSDNライブラリーの「非同期通知イベントの提供」を
参照してください。
ご回答ありがとうございます。
>MSDNライブラリーの「非同期通知イベントの提供」を参照してください。
「非同期」といういうキーワードがどんぴしゃりだったのですね。
系がVB-DLLではなかったですが,良いサンプルがのっていました。
どうもありがとうございました。
いずれ処理の分散化?並列化?を考えていたため,
実は既にスレッドをたてて計算しています。
プロセス間通信という言葉を聞いたことがあったので,
マルチスレッド・マルチプロセスのところをいろいろ調べていたのですが,
調べ方が足りなかったようですね。いやはや。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- 物理学 Va=1/4πε × (q1/a + q2/b + q3/c) Vc=1/4πε × (q1+q2+ 2 2023/04/16 14:08
- 労働相談 有給休暇使用時の賃金の計算方法について 5 2022/04/04 00:02
- 物理学 質量とは何か? 6 2023/04/17 20:44
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- 高校 高校化学有効数字計算 4 2023/02/26 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
C言語の課題で、1年の秒数を計...
-
バッチファイルでウインドウを...
-
骨折リスク評価のFRAXについて...
-
変化させるセルが変化しない
-
CとFORTRANの計算速度はどちら...
-
なぜオーバーフローになるので...
-
数値計算の高速化 (cos, sin, exp)
-
モジュラス103の計算とは何でし...
-
C# 計算処理中に実行中ウィン...
-
モジュロ
-
60進数の四則計算
-
C言語についてです。 再帰を使...
-
引き放し法による除算アルゴリ...
-
Perlで時間の計算
-
傾いた四角形内の範囲の条件式
-
CRC8を教えてください
おすすめ情報