2009-07-20 28 views
2

私はC++で書かれたいくつかのソースコードを理解しようとしています。私はちょっとおなじみですが、C++の ですが、次のコードシーケンスは私にとって初めてのものです。ここで私はカーネル、ptest-> Run()でいくつかのスレッドルーチンを登録すると推測する だろう。そうかもしれない?C++初心者質問:ThreadProc

static unsigned int __stdcall ThreadProc(void *lParameter) 
{ 
CTest *ptest; 

ptest= (Ctest *)lParameter; 
ptest->Run(); 
return 0; 
} 


CTest::CTest(int n) 
{ 
... 
} 

答えて

0

どのようなOSですか? Windowsのサンプルのように見える、そうであればbegin_thread()、またはCreateThreadをか...いくつかの

+0

はい、Windows上 –

2

簡素化ビットが、スレッドが、この場合ThreadProcでは、機能です。スレッドが開始すると関数が呼び出され、関数が終了するとスレッドは終了します。

この場合、誰かがCreateThread、begin_threadなどでスレッドを開始し、CTestという名前のクラスへのポインタを引数として渡しています。スレッドはそれをCTest *にキャストします(引数がCreateThread APIによってより一般的なvoid *として渡されているのがわかるように)。終了する前にCTest :: Runメソッドを呼び出します。

編集:また、 "__stdcall"宣言を除いて、これはWindows固有ではありません。 CとC++のスレッドは、すべてのOSでこのように多かれ少なかれ動作します。

1

これはあなたのスレッド関数です:

static unsigned int __stdcall ThreadProc(void *lParameter) 

これは、それが原因で発生したものとは異なるスレッドで実行されます。コードを呼び出すとCTest型のオブジェクトが作成され、ThreadProcを実行するスレッドが作成されます。このスレッドはptest-> Run()を実行します。

ThreadProcは、ptest-> Run()を起動するための便利なラッパーです。あなたが表示されたコードがCTESTクラスのオブジェクトへのポインタを宣言し

0

(それ以外の場合は、メンバ関数へのポインタを使用することがちょっと難しいですので)、そのrunメソッドを呼び出します、それらの1つに入力パラメータを変換します。

これが行われるはトリッキーな部分である理由

。通常、このようなコードは記述しませんが、ThreadProcのプロファイルはスレッドのメインエントリポイントのプロファイルです。それらのうちの1つについては、Windowsはパラメータプロファイルの選択肢を提供しておらず、クラスメンバでもありません。

あなたはクラスメソッドの呼び出しにWindowsの必要なフォームから、スレッドのエントリポイントのコールバックを変換するためにかなり標準的なコードがあるが何をしています。これの完全な説明については

、質問のための私の(受け入れ)の回答を参照してください。Passing Function pointers in C++

1

これは、DLLからエクスポートまたはコールバックとして使用される関数を定義するために使用される関数のシグネチャであります関数。この場合、おそらくワーカースレッドのメインループで使用されることになります。

__stdcallキーワードは、関数呼び出しが

OOPS stdcall calling convention in Windows(のWin32 APIからエクスポートされた方法で使用したものと同じ)を使用してスタックに渡されることを示しています。このリンクは値下げhttp://msdn.microsoft.com/en-us/library/zxk0tw93(VS.80).aspx

で素晴らしいプレーしません。
+0

あなたのためのリンクを修正しました。とにかく(VS.80)部分はMSDN URLでは重要ではありません。 – MSalters