0

私はさまざまなスレッドで作業を始めたばかりで、現在「無限」の問題に直面しています。基本的な考え方は、検出器の読み取りのためにスレッドを開始し、キャリブレーションのためにスレッドを停止することです。その後も継続する必要があります。

次のコードは、私がやろうとしていることの最小限の例です。Windows.h は Sleep 関数に使用され、例を少し遅らせるものと交換される可能性があります。

// header for ThreadTest
#include <boost/thread.hpp> 
#include <windows.h>
#include <iostream>

class ThreadTest;
void thread(ThreadTest* test);

class ThreadTest {
public:
bool _doWork;
void startTest(){
    _doWork = true;  
    _test = boost::thread(thread,this);
}

void stopTest() {
    _doWork = false;
    _test.join();
};
private:
boost::thread _test;    
};

void thread(ThreadTest* test) {
while (test->_doWork) {
    std::cout << "Working..." << std::endl; 
    Sleep(2000);
}
}

int main(int argc, char* argv[])
{
ThreadTest test;
int a=0;

std::cout << "Start Test 1" << std::endl;
test.startTest();

std::cin >> a;

std::cout << "Stop Test 1" << std::endl;
test.stopTest();

std::cout << "Start Test 2" << std::endl;
test.startTest();

std::cin >> a;

std::cout << "Stop Test 2" << std::endl;
test.stopTest();

std::cout << "Start Test 3" << std::endl;
test.startTest();

std::cin >> a;

std::cout << "Stop Test 3" << std::endl;
test.stopTest();

return 0;
}

cin が何らかの入力を取得するまで、スレッドが初めて実行されます。その後、プログラムは 2 番目または 3 番目の cin で待つことなく続行されます。この動作が発生する理由、またはそれを防ぐ方法を知っている人はいますか?

アドバイスをいただきありがとうございます。

4

1 に答える 1

0

どのような入力がありますstd::cinか? 数値 ( int) でない場合はstd::cinが設定されfailbit、以降のすべての入力は何も行われず、すぐに戻ります。ユーザーが何かをするのを待つだけなら、 を使用 std::ignore( std::numeric_limits<streamsize>::max(), '\n' )するのが良い解決策です。これは、ユーザーが新しい行を入力するまで待機します。

于 2013-05-13T13:51:01.640 に答える