dポイントプレゼントキャンペーン実施中!

VC++6.0 コンソールアプリケーションで作成されたプログラムの
ある一つのクラスを別スレッドで動かしたいと思っています。

void main () {

~メインの処理~

ClassA clsa;
clsa.fnc();←ここを別スレッドで動かしたい

~メインの処理~
}

ClassA クラスは閉じたクラスでそこから別のクラスをコールしたりはしません。

なにか参考になるようなサイトなどでもかまいませんので
方法などわかる方は教えてください。

A 回答 (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(); // スレッドの終了待ち
}

実際のコードでは、排他処理、二重起動防止、デストラクタでのスレッドの終了など検討が必要になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/01/12 17:20

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 …
    • good
    • 0

なにがわからんのかわからんのですが:



#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";
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!