0

スレッドメソッドでオブジェクトを参照するときに使用する、それ自体を指す静的変数が必要です。私はこのタイプの_beginthreadメソッドを使用しようとしてprocess.h います。このタイプの多くのオブジェクトはスレッドメソッドを使用する予定です。インスタンス変数がクラス全体で共有されているため、現在これは失敗しています。threadLoopで使用するにはインスタンス変数を静的にする必要があり、オブジェクトを参照するためにインスタンス変数が必要です。助言がありますか?

ヘッダ: static Nodes *instance;

実装: Nodes *Nodes::instance = NULL;

main.cpp:

for(int c = 0; c < 7; c++)
{
    nodesVect.push_back(Nodes(c, c+10));
}

for(int c = 0; c < 7; c++) 
{
   nodesVect.at(c).init(); // init() {  instance = this;  }
}
4

1 に答える 1

0

私の_beginthreadex()の使用法は次のとおりです。

cStartable基本クラス

virtual bool Start(int numberOfThreadsToSpawn);
virtual bool Stop();
virtural int Run(cThread &myThread) = 0;
//the magic...
friend unsigned __stdcall threadfunc(void *pvarg);
void StartableMain();

majicは:

unsigned __stdcall threadfunc(void *pvarg)
{
    cStartable *pMe = reinterpret_cast<cStartable*>(pvarg);
    pMe->StartableMain();
}
void cStartable::StartableMain()
{
   //Find my threadId in my threadMap
   cThread *pMyThread = mThreadMap.find( GetCurrentThreadId() );
   int rc = Run( pMyThread );
}
bool cStartable::Start()
{
   cThread *pThread = new cThread();
   pThread->Init();
   mThreadMap.insert( tThreadMapData(pThread->mThreadId, pThread) );
}

およびユーティリティcThreadクラス。

bool cThread::Init(cStartable *pStartable)
{
    _beginthreadex( NULL, /*stack*/ 65535), &threadfunc, pStartable, /*initstate*/0, &mThreadId );
     // now cThread has a unique bit of info that can match itself up within the startable's run.   
}

スレッドを必要とするものはstartableから継承し、Runを実装します。

class Node : public cStartable {}

ここでコードをかなり編集しました。単一のオブジェクトから複数のスレッドインスタンスを一度に生成し、サブクラスレベルで非常にクリーンにすることができるのは、すべて非常に堅牢で静かで強力です。

このすべてのポイントは、cNode :: Run()が、スレッドごとのインスタンスのヒープデータをアタッチできるスレッドごとのインスタンスオブジェクトに渡されることです。それ以外の場合、すべてのスレッドインスタンスは、単一のクラスインスタンスを「メモリスペース」として共有します。私はそれが好きです:)あなたがより多くの詳細を必要とするならば、私は共有してうれしいです。

于 2012-04-06T01:16:12.720 に答える