ActiveX EXEを使用したプログラムで並列動作しない問題

このQ&Aのポイント
  • ActiveX EXEを使用したプログラムで、並列動作しない問題が発生しています。
  • プログラムは正常に動作していますが、関数実行終了まで戻ってこないため、目的の並列処理ができていません。
  • プログラム構造上、問題があるかどうか確認したいです。
回答を見る
  • ベストアンサー

並列動作しない?ActiveX EXE

たびたび申しわけありません。 質問番号:5696830で質問した者です。 自分なりに調べ、アウトプロセスで動くと思われるActiveX EXEを使用した プログラムを行ってみましたが… 並列動作しません…プログラム的には、 ActiveX EXE → Project1 Class1の中の 関数の中に、   For i=0 to 10   Sleep(1000)   Next クライアントVBA → 上記参照設定後 Dim obj As MyComponent.MyClass Set obj = New MyClass 関数実行! としました。問題なく動作はします。 しかし、並列処理ではなく、関数実行終了(Forループ終了)まで 戻ってきません。これでは、ActiveX EXEを使用した目的が…? このような具合です。 私のプログラム構造上、おかしな箇所はありませんでしょうか? よろしくお願いいたします。

  • tmk2z
  • お礼率69% (29/42)

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

VB6.0ですと単体ではマルチスレッドに対応していないので、マルチスレッドや同期処理を行うには記述難度が跳ね上がりますが・・・ VB.netなら.Net FrameworkにSystem.Threading名前空間に該当クラスライブラリがあり、比較的容易にマルチスレッドや同期処理が記述できるんですが・・・

tmk2z
質問者

補足

アドバイスありがとうございます。 しかし今回は、時間と環境が制限されているため VB6.0しか使用できないんです…

その他の回答 (2)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

このActiveXは記述からみてVB.netで書かれたんでしょうか? プログラムがかなり断片的にしか書かれてないの推測の範囲でしか回答できませんが、 「ExcelVBAから計測開始関数を複数一斉に呼び出し、その語すべての計測終了を待ってから次の処理を開始する。その計測処理を並列で同時に行いたいが、計測が終了したことがわからないといけない。」 ということをやりたいのでしょうか?? これを実現するにはマルチスレッドと同期処理が必要になると思います。

tmk2z
質問者

お礼

ありがとうございました。 ActiveX側でタイマーイベントを発生させ、マルチスレッドを実現することが出来ました。 ヒントをくださいまし、ありがとうございました。

tmk2z
質問者

補足

ご返答、ありがとうございます。 はい、私のやりたい事は、おっしゃるとおりです。 今朝、マルチスレッドが必要という所まで行き着く事が出来ました。 (ちなみにVB6.0です) タイマーを使用しながら、プログラム組んでいますが 『計測器』に渡す引数が、タイマーイベントに渡すことが出来なくて 困っています。 やはり、タイマーを使用するしかないのでしょうか? 他にマルチスレッドでいい方法があれば、教えてください。 大変お手数で、申し訳ありませんが、よろしくお願いします。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1

VB6の場合で回答します。 VBはループの中ではCPUをつかんでいますので、他に制御を渡しません。 従って、forのようなループで他に制御を渡したい場合は、forの中に Doevents を記述する必要があります。

関連するQ&A

  • ActiveXコントロールの作成(VB6)

    こんばんは。 今、VB6でActiveXコントロールを作成しようと思っています。 現在、標準EXEにて、プログラムが作ってあります。 動作としては、 1.スタートボタン(CmdStart)で開始 2.処理(外部の測定器によるデータ収集) 3.終了ボタン(CmdEnd)にてプログラム終了 です。 これをもとに、ActiveXコントロールを作成したいです。手元にある文献にしたがってほぼコピー&ペーストで作成しました。また、これの動作を調べるため、標準EXEのフォームを作成し、そのフォームにActiveXコントロールを貼り付けました。 ここで質問です。 Form_LoadはUserControl_Initializeに書き換えました。(これは文献に載っていました) 最後のプログラム終了がうまくいきません。 標準EXEでは Private Sub CmdEnd_Click() Unload Me End Sub と書いてプログラムを終了させていました。 ここを書き換えずにActiveXコントロールを実行させたらエラーが出ました。"Unload Me"を"End"に書き換えてみたら、サポートされていないと出ました。 CmdEndをクリックしてプログラムを終了させるにはどう書けばいいでしょうか? よろしくお願いします。

  • VC++6.0で作成されたActiveXコントロール

    まだプログラミングを始めて日が浅いため、馬鹿な質問をしていたら申し訳ありません。 現在、ActiveXコントロールを使ったプログラムを作成しております。 メインの環境がVC++2008なのですが、このActiveXコントロールがVC++6.0で作られた物であるため、VC++2008で使用しようとするとエラーが出てしまいます。 またプログラム中で使っているライブラリの中でVC++6.0で動いてくれないものもあり、私としては慣れないVC++6.0より何とかして2008でこれを使いたいのですが・・・ 一応現在はVC++6.0でこのActiveXコントロールを動作させるプログラム(以下exeと略)を作り、このexeをVC++2008のプログラム内でCreateProcess関数で呼び出すと言う方法を取っています。 引数はコマンドライン引数、処理結果はファイル経由で受け渡しをしています。 このActiveXコントロールというのがあるカメラから画像を取得するものですので、どうして処理時間の長さが気になります。 そこでプロセスの起動と終了にかかる無駄な時間を減らすため、このexeをDLL化できないものかと考えています。 前置きが長くなりましたが、私が質問したいことは (1)「VC++6.0で作られたActiveXコントロール」を使用したDLLを作れるのか?作れるのならばそれはVC++2008で使えるのか? (2)DLL化以外に処理時間を短くする方法はないか?(例えばexeを立ち上げっぱなしにしたまま引数等をメインプログラムとやり取りできないか?) の2点です。 なおこのActiveXコントロールはソースがないため、VC++2008でビルドしなおすと言う手が使えません。 よろしくお願いします。

  • オブジェクトの参照を返す関数の扱い

    オブジェクトの作成と関数との関係を勉強していますが参照の使い方に関して質問させていただきたいと思います。 以下のような簡単なプログラムを作りました。 myclass.cpp myclass.h で記述されたクラスmyclassは整数を一つ持ち、show_value関数でその整数を表示し、say_heyで"hey"という文字を出力するというものです。 このクラスを利用するプログラムとしてmain.cppをつくりました。このなかには2つの関数が使われます。 -オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   -オブジェクトをつくりそれの参照を返す関数(return_ref_obj) これらの関数を用いてオブジェクトをつくり、そのオブジェクトを戻り値としてmainのなかでオブジェクトのshow_value関数で保持する整数を表示する、というものです。 myclass.h-------------------------------- class Myclass{ public: int my_int; Myclass(); ~Myclass(); void show_value(); void say_hey(); }; myclass.cpp---------------------------------- #include "myclass.h" #include <iostream> using namespace std; Myclass::Myclass(){}; Myclass::~Myclass(){}; void Myclass::show_value(){ printf("%d\n", my_int); } void Myclass::say_hey(){ printf("hey\n"); } main.cpp------------ #include <iostream> #include "myclass.h" using namespace std; //オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   Myclass return_obj(int int_in){ Myclass myobject; myobject.my_int = int_in; //引数をオブジェクトのmy_intに渡す return myobject; } //オブジェクトをつくりそれの参照を返す関数(return_ref_obj) Myclass& return_ref_obj(int int_in2){ Myclass myobject; myobject.my_int = int_in2;   //引数をオブジェクトのmy_intに渡す Myclass& ref_of_myclass = myobject; return ref_of_myclass; } void main(){ Myclass returned_obj = return_obj(1); //関数に1を渡し、1を保持するオブジェクトを作成 returned_obj.show_value(); //整数(1)表示 returned_obj.say_hey(); Myclass& ref_obj = return_ref_obj(2); //関数に2を渡し、2を保持するオブジェクトを作成し参照として受け取る ref_obj.show_value(); //整数(2)表示 ref_obj.say_hey(); } プログラムを実行した出力------------------- 1 hey -858993460 hey このようにオブジェクト自体を返してコピーしたもの(return_obj使用)はshow_valueでただしくオブジェクトに保持された数が表示されますが 参照でオブジェクトを返したもの(return_ref_obj使用)はアドレスのような数列が表示されます。 質問A これはオブジェクトの参照を返す関数(return_ref_obj)でオブジェクトを作成しても、そのオブジェクトが関数の中でのみ実在しており、関数がおわるとその実体がなくなるためではないかと解釈しているのですがそれで正しいでしょうか? 質問B 関数でオブジェクトを作成してそれをプログラム本体に渡すときはreturn_objのようにオブジェクト自体をコピーしなければ参照などで渡すことはできないのでしょうか? クラスと参照自体勉強を始めたばかりで色々と初歩的な間違いもあるとは思いますが、よろしくお願いします

  • ActiveX の作り方について教えて下さい

    以下の環境でMSのVC++ で ActiveX を作成しようとしているのですが、 うまくアクセス出来ません。   プラットフォーム:WindowsVista   VC++ :Ver.6 ActiveX の作り方について教えて下さい。 『プロジェクト』の『MFC ActiveX ControlWizard』を指定し、 プロジェクト名:Sample でプログラムを作成し、 下記の内容で、Variant 型のメソド:RetVariant を作成ました。 ┌─────────────────────────────── │ 1: VARIANT CSampleCtrl::RetVariant() │ 2: { │ 3: static VARIANT vaResult; │ 4: VariantInit(&vaResult); │ 5: // TODO: ここにディスパッチ ハンドラ コードを追加してください。 │ 6: │ 7: vaResult.vt = VT_I4; │ 8: vaResult.lVal = 1234; │ 9: │10: return vaResult; │11: } └─────────────────────────────── これを『C:\Windows\System32』にコピーし、『regsvr32.exe』で登録しました。 その後、少し古いですが、Excel2000 のVBAで下記のプログラムを実行すると、 正しく機能し、『1,234』と表示されました。 ┌─────────────────────────────── │ 1: Dim Obj │ 2: Dim ZZ │ 3: │ 4: Set Obj = CreateObject("SAMPLE.SampleCtrl.1") │ 5: │ 6: ZZ = Obj.RetVariant │ 7: MsgBox FormatNumber(ZZ,0) └─────────────────────────────── これをVBSで実行しようとすると、以下の様なエラーとなってしまいます。 ┌─────────────────────────────── │ 行: 6 │ 文字: 5 │ エラー: 致命的なエラーです。 │ コード: 8000FFFF │ ソース: (null) └─────────────────────────────── 4行目の所を『Set Obj = WScript.CreateObject("SAMPLE.SampleCtrl.1")』 としても同じでした。 どうしてVBAではOKで、VBSではNGになるのでしょうか。 どの様にしたらエラーを解消出来るのでしょうか。

  • ActiveXが・・・・・

    子供がアンパンマンのHPの中のぬりえやおえかきなどをしようとすると「このWebページでActiveXコントロールを実行するにはクリックしてください」と表示されるので「OK」をクリックするのですが「問題が発生したため、iexplore.exeを終了します。ご不便をかけて申し訳ありません」と出てエクスプロラーが終了してしまいます。以前は問題なくできたのですが。PCはSOTECでOSはXPです。

  • EXEの起動について

    プログラムの連続起動をバッチファイルで作成しています。 本体(A.EXE)を連続起動させるべくfor文でテキストファイルを読み込み引数を与えながら起動して、ということをしたいのですが、A.EXEは自動で終了するもののワケあって終了した状態を取得できません。 そこで監視(B.EXE)を実行してA.EXEの終了を待つプログラムを用意しました。 for文の中でA.EXE起動→5秒待ち→B.EXE起動(バッチは待ち状態)→A.EXE終了→B.EXE終了(バッチ待ち解除)→2回目のA.EXE起動…という流れを想定していますが、B.EXEが待ち状態にならずA.EXEが実行されてしまいます。 バッチの中身をコマンドプロンプトで実行するとB.EXEは待ち状態となるのですがバッチ実行すると待ち状態になりません。 なにが原因かわからず質問いたしました。 ご助力いただけると助かります。 以下はバッチ内容です(for文は除きます)。 ----------------- start C:\work\A.EXE timeout 5 start /w C:\work\B.EXE ----------------- よろしくお願いします。

  • ActiveX → VB を起動するとCreateObjectできない。

    初めまして。 2003Server+IIS6.0の環境でASP内のActiveXからShell関数でvbのexeを実行させる処理を作成しております。 サーバーから直接exeを実行させると正常に動くのですが、Web上からasp→ActiveX→exeを起動させるとテキストに書き込む処理はできるのですが、「CreateObject」文で「ActiveX コンポーネントはオブジェクトを作成できません」というエラーが返ります。 VB内でなぜ「CreateObject」が出来ないのかご存知の方はいますでしょうか。 宜しくお願いいたします。

  • C言語のプログラムにて二つの処理を並列させる方法はあるのでしょうか?

    C言語の並列処理について調べているのですが、並列処理はfor文などの単調な処理を並列処理にすることで実行を早くするということがわかったのですが、実行ファイル内で同時に二つの違う動作をさせることは可能なのでしょうか?

  • 自分以外のPerl.exeを強制終了させる方法について

    現在、Windows 2000とXPで、perlを、test.batをダブルクリックする形で使っています。 他にも、並列で、いくつか、同様の方法でperlを実行させていますが、test.cgiが終了した時、test.cgi以外のperlプログラムを全て強制終了させたいのですが、何か、良い方法はないでしょうか? ----test.bat--- perl test.cgi ---- ----test.cgi--- sleep 10; exec("taskkill /F /IM perl.exe"); print 'test.cgi以外のperl.exeを強制終了しました'; ---- 上記方法を試してみたのですが、自身のperl強制終了されてしまいます。 実際は、printの部分には様々な動作を行うため、自身のPIDを見つけ出して、それ以外を強制終了するような方法が最適です。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • EXEファイルを実行できません。

    VB6でプログラムをつくりました(OS:WINDOWS98)が、EXEファイルを他のPC(OS:WINDOWS2000/WINDOWS95等)で実行させるのですが、うまくうごきません。API関数を使用しているのでこのためかと思いますが、どのように対処したらよいかわかりません。 "SLEEP" "RegCloseKey/RegOpenKeyEx" "RegQueryValueExstr" "Keybd_event" を使用しています。 他のPCにはソフトの干渉からVBをインストールすることはできません。 DLLをシステムに入れることなら問題ないのですが、どなたか教えていただけませんか?

専門家に質問してみよう