2011-12-05 9 views
0

私はWindowsでのスレッドに関する小さな質問があります。私Mthreadクラスを作成しているWindows上のスレッド

main.cppに

int  main(int ac, char **av) 
{ 
    std::vector<Mthread *> mythread; 
    std::list<std::string> stack; 
    DWORD  id = 0; 

    stack.push_back("Maison"); 
    stack.push_back("Femmes"); 
    stack.push_back("Fetes"); 
    stack.push_back("Voitures"); 
    stack.push_back("Nounours"); 
    while (id != 5) 
    { 
     mythread.push_back(new Mthread()); 
     mythread[mythread.size() - 1]->initThread(&stack, id); 
     id++; 
    } 
    id = 0; 
    while (id != 5) 
    { 
     WaitForInputIdle(mythread[id]->getThread(), INFINITE); 
     id++; 
    } 
    return (1); 
} 

とMthread.cpp:私は、次のコードを持っています。

Mthread::Mthread() {} 

Mthread::~Mthread() {} 

HANDLE  Mthread::getThread(void) const 
{ 
    return (this->thread); 
} 

bool  Mthread::initThread(std::list<std::string> *list, DWORD ID) 
{ 
    this->save = list; 
    this->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Mthread::ThreadFunc, (LPVOID)list, 0, &ID); 
    if (this->thread == NULL) 
    { 
     std::cout << "Erreur lors du lancement du thread" << std::endl; 
     return (false); 
    } 
    else 
    { 
     return (true); 
    } 
} 

void  Mthread::ThreadFunc(LPVOID list) 
{ 
     std::cout << " is launch" << std::endl; 
} 

コードは機能していますが、小さな問題があります。端末に文字列が書き込まれていません。

bool  Mthread::initThread(std::list<std::string> *list, DWORD ID) 
{ 
    this->save = list; 
    this->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Mthread::ThreadFunc, (LPVOID)list, 0, &ID); 
    if (this->thread == NULL) 
    { 
     std::cout << "Erreur lors du lancement du thread" << std::endl; 
     return (false); 
    } 
    else 
    { 
     std::cout << "OK" << std::endl; 
     return (true); 
    } 
} 

まあ、「OK」と「打ち上げである」端末上で5回書き込まれます。私は自分のコードを変更した場合 しかし、なぜか分からない。 小さな文字列aをcoutに渡すと動作しているようですが、何も書かれていないときは何も書かれていません。

+0

何が起こりますか?あなたのstd :: list/stackの目的は何ですか?あなたは「小さな叙情」を意味するのですか? – wolfgang

+0

まあ、 'Sleep(4);'を追加した後、5つではなく 'launch'が1つしか書かれません。スレッドの終了を待っている関数を知っていますか? –

答えて

1

終了する前に、スレッドがジョブを終了するまでプログラムは待機する必要があります。窓では、WaitForMultipleObjectsを見てください。

+0

okありがとう、私はこの機能を試してみます –

+0

うん、それはうまく動作します!ありがとう、この:) –

2

短い答え:あなたのmain()スレッドが実行する前に終了すると思います。 sleep()またはmainと同様のものを追加してください。

もっと複雑な答え: - スレッドとメインは互いに独立して実行されます。メインを終了することができるまで、メインで待たなければなりません。 - あなたのプログラムは、同期せずにすべてのスレッドがベクトルにアクセスするので、安全ではありません。ロック、ミューテックス、セマフォを読み込んでください!

+0

ええ、私はベクトルを知っています。私はそれを使用する必要があるため、私は私の問題を修正した後、私はこれをロックします。私は自分の質問を更新する。私は 'WaitForInputIdle'をメインに追加します。しかし、それは常に動作しません... –

+0

それはうまく動作します!ありがとうございます:) –

+1

'WaitForInputIdle'を使わないでください。 Shawnoneの回答を参照して、使用する関数の正しいファミリを確認してください。 –

関連する問題