• ベストアンサー

マルチスレッド?

VC++6.0 コンソールアプリケーションで作成されたプログラムの ある一つのクラスを別スレッドで動かしたいと思っています。 void main () { ~メインの処理~ ClassA clsa; clsa.fnc();←ここを別スレッドで動かしたい ~メインの処理~ } ClassA クラスは閉じたクラスでそこから別のクラスをコールしたりはしません。 なにか参考になるようなサイトなどでもかまいませんので 方法などわかる方は教えてください。

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

  • ベストアンサー
  • gentoo314
  • ベストアンサー率41% (15/36)
回答No.3

ひな形です。 適当にかいたのでこのままでは動かないので、ご参考に。 ポイントは  ・スレッドはstaticな関数にする必要がある。  ・スレッド生成時に this ポインタを渡す。  ・スレッド関数内では、直接メンバー変数、関数にアクセスできない   (この例では that ポインタ経由でアクセスしています) class ClassA { public: void fnc() { _hThread = ::beginthreadex(threadfnc, this); } void wait() { ::WaitForSingleObject( _hThread, INFINITE ); } protected: static int threadfnc( void* pParam ) { ClassA* that = (ClassA*)pParam; that->_x = 0; // that経由でメンバーにアクセス that->fnc2(); ::endreadex(0); return 0; } void fnc2() {} int _x; HANDLE _hThread; } main() { ClassA clsa; clsa.fnc(); // スレッドを生成すると fnc はすぐに抜けてくる。 // この間にメインスレッドはCPU資源が空いている。 clsa.wait(); // スレッドの終了待ち } 実際のコードでは、排他処理、二重起動防止、デストラクタでのスレッドの終了など検討が必要になります。

C_S_C
質問者

お礼

レスが遅れてしまい申し訳ありませんでした。 参考にしてみます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

static なメソッドなら普通に _beginthread や _beginthreadex を使用すればいいと思いますが、 static でないメソッドなら、_beginthread や _beginthreadex の arglist ( 末尾のリンク先を参照 ) として &clsa を渡し、呼ばれたスレッドで unsigned int foo( void *p ) { ClassA *pca = ( ClassA * )p; pca->fnc(); return 0; } などのようにして fnc() を呼び出してはどうでしょうか。

参考URL:
http://msdn.microsoft.com/ja-jp/library/kdzttdcb(v=vs.80).aspx
すると、全ての回答が全文表示されます。
回答No.1

なにがわからんのかわからんのですが: #include <Windows.h> #include <iostream> using namespace std; class ClassA { public: void fnc() { for ( int i = 0; i < 10; ++i ) cout << "fnc " << flush; } }; DWORD WINAPI entry(LPVOID arg) { ClassA clsa; clsa.fnc(); return 0; } int main() { DWORD thr; HANDLE h = CreateThread(NULL, 0, &entry, NULL, 0, &thr); cout << "wait thread's completion\n"; WaitForSingleObject(h, INFINITE); CloseHandle(h); cout << "\nthat's it\n"; }

すると、全ての回答が全文表示されます。