2011-12-13 4 views
0

いくつかのマルチスレッド作業のための練習として、Windows CE 5.0用の簡単なアプリケーションを作成しました。私は2秒後にプログラムがスレッド2からのダイアログボックスが表示されていることを期待していたWindows CEの単純なマルチスレッドアプリケーション - スレッドスケジューリング

LPTHREAD_START_ROUTINE myThreadFunc() 
{ 
    Sleep(3000); 
    MessageBox(NULL, _T("thread 1"), _T("thread 1"), MB_OK); 
    return 0; 
} 

LPTHREAD_START_ROUTINE myThreadFunc2() 
{ 
    Sleep(2000); 
    MessageBox(NULL, _T("thread 2"), _T("thread 2"), MB_OK); 
    return 0; 
} 

と:私は二回、スレッド作成するための機能を呼び出していますWinMain関数で :スレッドで実行さ

myThread = CreateThread(NULL, 0, myThreadFunc(), NULL, 0, NULL); 
myThread2 = CreateThread(NULL, 0, myThreadFunc2(), NULL, 0, NULL); 

と機能は次のようになります次の1秒後にスレッド1のダイアログボックスが表示されます。しかし、実際にこのプログラムを実行しているときは、最初のダイアログボックスでスレッド1から2秒後にスレッド2から次の3秒後にダイアログボックスに表示されます。このトレッドは、私が期待していたように連続して走っているのではなく、同時に走っているようです。誰も私にこの行動を説明できますか?

私は、Windows CE 5.0用のWindows CE用の組み込みVisual C++とエミュレータを使用しています。

ありがとうございます。

+0

が、他のスレッドを生成、あなたのメインスレッドが実行されても覚えている:

myThread = CreateThread(NULL, 0, myThreadFunc(), NULL, 0, NULL); 

私は入力する必要があります。おそらく、両方のスレッドがメインスレッドによって設定した開始イベントで待機し、結果がより予測可能かどうかを確認してください。 – Damon8or

+0

これをデバッグ出力またはコンソールにダンプすると(つまり、GWESウィンドウシステム経由で送信しないと、実際には、すべてのUIアクセスがポンプスレッド上で行われるのが本当に好きです)、何が表示されますか? – ctacke

答えて

0

編集:正解はコメントです。

ありがとうございました。私はちょうど私が関数createThread()の呼び出しを間違っていることに気づいた。代わりに:少しオフに聞こえる

myThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&myThreadFunc, NULL, 0, NULL); 
+1

よろしく、いいえ。それを受け入れるために、CreateThread()を得るために関数ポインタをキャストする必要はありません。その代わりに、関数宣言を修正してください。これは現在、パラメータを取らずにLPTHREAD_START_ROUTINEを返す関数です。そのタイプとMSDNの定義を調べてください。しかし、キャストせずにコンパイルしないと、コードは間違っています! –