もともと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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
C言語 配列の長さの上限
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
モジュロ
-
バッチファイルでウインドウを...
-
EXCELなどで「返す」という表現
-
VBでReplace
-
変化させるセルが変化しない
-
Visual C++でdebugとreleaseで...
-
エクセルで特定のセルのみを任...
-
2次元ラプラス方程式を差分法で...
-
計算量オーダーについて O(1/n...
-
スレッド処理からダイアログを...
-
排他的論理和 BCC(水平パリテ...
-
パルスを時間(m/min)の計算につ...
-
アドオン利率を実質年率に変換
-
シートの複写をデスクトップの...
-
エクセル VBAで 再計算を...
-
モジュラス103の計算とは何でし...
-
VBAの再計算が反映されない件に...
-
C# 計算処理中に実行中ウィン...
-
機械学習や画像処理でのプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
排他的論理和 BCC(水平パリテ...
-
VBAの再計算が反映されない件に...
-
バッチファイルでウインドウを...
-
変化させるセルが変化しない
-
EXCELなどで「返す」という表現
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
Visual C++でdebugとreleaseで...
-
モジュラス103の計算とは何でし...
-
なぜオーバーフローになるので...
-
VB6で正確なミリ秒を計測したい...
-
VBでReplace
-
引き放し法による除算アルゴリ...
-
matlabで計算終了
-
CRC8を教えてください
-
VBAで関数をつくる
-
Excel VBAの残業時間の合計計算...
-
等高線を計算したい
おすすめ情報