私は、ユーザが にrun()
メソッドを実装する必要があるスレッドベースクラスを提供するC++クラスライブラリを使用しています。Threadオブジェクトにパラメータを渡すにはどうすればいいですか?
run()
メソッドにパラメータを渡す方法はありますか?今すぐ 私はコンストラクタ(ポインタとして)を介してそれらを渡すことを好む。
私は、ユーザが にrun()
メソッドを実装する必要があるスレッドベースクラスを提供するC++クラスライブラリを使用しています。Threadオブジェクトにパラメータを渡すにはどうすればいいですか?
run()
メソッドにパラメータを渡す方法はありますか?今すぐ 私はコンストラクタ(ポインタとして)を介してそれらを渡すことを好む。
私はC++についてはわかりませんが、Javaでこれを行う方法です。 Thread(またはRunnableを実装する)を継承するクラスと、渡したいパラメータを持つコンストラクタがあります。その後、新しいスレッドを作成するとき、あなたは、引数に渡す必要があり、その後、スレッドを開始し、このような何か:
Thread t = new MyThread(args...);
t.start();
は、あなたのケースで同じでなければなりません。
コンストラクタで渡しても問題ありません。ポインタがスレッドより長く存続するようにしてください。
スレッド起動時のよくある問題は、渡される引数が呼び出し側関数のスタックにのみ存在することです。スレッドの起動はしばしば遅延され、呼び出し元の関数が戻り、実際にスレッドが実際に開始された後のほんの数時間です。引数が存在しなくなった時点です。
これを解決する方法の1つは、イベントを作成してスレッドを開始し、そのイベントを引数の1つとして渡すことです。開始機能はイベントを待機し、イベントが開始されるとスレッドによって通知されます。
への答えではありません。 –
私はそれを試みたことはありません。私には、プール内のスレッドの数を変更する必要があることが必要であることがあります。作業負荷が変化するため、それは扱いにくい問題です。 –
スレッドクラスのメンバーとしてパラメータを渡すことができます。スレッドを作成するスレッドは、おそらく、スレッドが開始する前に、他のメソッドおよび/または呼び出しメンバ関数を呼び出すことができます。したがって、それが動作するために必要なメンバーを移入することができます。 runメソッドが呼び出されると、起動に必要な情報が取得されます。
スレッドごとに別々のオブジェクトを使用することを前提としています。
あなたは通常、あなたが保護されたコンストラクタを持つことができますので、まあ、私は、[スタート]()メソッドにパラメータを置くことを好むなど、配列、ベクターに
getterメソッドを使うアプローチは素晴らしいですが、私はThreadコンストラクタを介してパラメータを渡す方が好きです。私は、コンストラクタが呼ばれた後でオブジェクトを使用できるようにしたい。 –
を作成したすべてのスレッドを置く、となり派生クラスコンストラクタを介してパラメータをカスケードする必要はありません。
私はprolly私declerationはこのような何かを見てみましょうと思います。ただ、例えば、あなたのパラメータが何らかの形で契約していることを確認して
class Thread
{
public:
virtual void Start(int parameterCount, void *pars);
protected:
Thread();
virtual void run(int parameterCount, void *pars) = 0;
}
を#1はint、#2はdoubleなどになります:)
代わりに、このThreadクラスを拡張して、コンストラクタパラメータとしてファンクタを受け入れることで、その中に任意の呼び出しをバインドすることができます。
スレッドを使用するクラスは、スレッドから継承する必要はありませんが、1つ(またはそれ以上)のスレッドメンバーのみを持つ必要があります。で)あなたのスレッドが 2を必要とするすべてのデータをカプセル化するデータ構造を定義します)
1:ファンクタは、ここであなたが望む任意の開始点(任意のパラメータを持つクラスのいくつかの方法)
が典型的なパターンで呼び出しますメインスレッドは、演算子newを使用してヒープ上のデータ構造のコピーをインスタンス化します。 3)データ構造を記入し、ポインタをvoid *にキャストし、スレッドライブラリによって提供された方法でvoid *をスレッドプロシージャに渡します。 4)ワーカースレッドがvoid *を取得すると、それをデータ構造体にreinterpret_castしてから、オブジェクトの所有権を取得します。つまり、スレッドがデータを使用して完了したとき、スレッドはそれを割り当て解除するメインスレッドではなく、そのスレッドを解放します。
ここでは、Windowsで&テストをコンパイルできるサンプルコードを示します。
#include "stdafx.h"
#include <windows.h>
#include <process.h>
struct ThreadData
{
HANDLE isRunning_;
};
DWORD WINAPI threadProc(void* v)
{
ThreadData* data = reinterpret_cast<ThreadData*>(v);
if(!data)
return 0;
// tell the main thread that we are up & running
SetEvent(data->isRunning_);
// do your work here...
return 1;
}
int main()
{
// must use heap-based allocation here so that we can transfer ownership
// of this ThreadData object to the worker thread. In other words,
// the threadProc() function will own & deallocate this resource when it's
// done with it.
ThreadData * data = new ThreadData;
data->isRunning_ = CreateEvent(0, 1, 0, 0);
// kick off the new thread, passing the thread data
DWORD id = 0;
HANDLE thread = CreateThread(0, 0, threadProc, reinterpret_cast<void*>(data), 0, &id);
// wait for the worker thread to get up & running
//
// in real code, you need to check the return value from WFSO and handle it acordingly.
// Here I assume the retval is WAIT_OBJECT_0, indicating that the data->isRunning_ event
// has become signaled
WaitForSingleObject(data->isRunning_,INFINITE);
// we're done, wait for the thread to die
WaitForSingleObject(thread, INFINITE);
CloseHandle(thread);
return 0;
}
ハ、ジャワの答えは質問に受け入れられたC++をタグ付け:) –
これは確かに一つのスレッドプールを使用すべき理由であるこの質問 –