2010-01-15 13 views
3

내 프로그램에는 사용자로부터 명령 입력을받는 주 스레드가 있습니다. 이와는 별도로 백그라운드에서 데이터를 변조하는 잠재적 인 배수의 작업자 스레드가 있습니다.작업자 스레드에서 cin으로 출력 (C++)

사용자는 콘솔에 입력하여 명령을 사용하여 프로그램을 종료 할 수 있습니다. 그러나 데이터 변동이 완료되면 주 스레드는 여전히 사용자 입력 대기를 차단하므로 프로그램이 종료되지 않습니다.

차단 명령 입력 스레드 (주 스레드)가 종료되도록 작업 스레드에서 std::cin으로 "q \ n"종료 명령을 작성하는 방법을 알고 싶습니다. 아니면이 일이 좋지 않겠습니까? 아래에서 시도했지만 프로그램이 단순히 응답하지 않거나 std::cin에 쓸 수 없습니다. 이유는 확실하지 않습니다. 메인 스레드에

static ACE_THR_FUNC_RETURN worker(void *p) { 
..... 
    if (_this->m_num_threads_done == _this->m_threads.size()) { 
     fputs("q\n", stdin); 
    } 

} 

,이 메인에서 호출됩니다

void runEventLoop() 
{ 
    printWelcomeMessage(); 

    char buffer[MAXC]; 
    while(!m_exitLoop) 
    { 
     std::cin.getline(buffer, MAXC); 
     if(std::cin.eof()) 
      break; 
     handleCommand(buffer); 
    } 
} 

사람이 내가 노력하고있어 더 나은 솔루션을 제안 그렇지 않으면 내가 잘못 여기서 뭘하는지에 대한 조언이나하시기 바랍니다 것입니다 달하다?

감사

+1

std :: cin은 C++의 _input_ 스트림입니다. 당신은 그것에 쓰지 않고 그것을 읽을 수 있습니다. stdout에 대해 이야기하고 싶습니까? – Dima

+0

유닉스에서는 출력을 입력으로 재 지정할 수 있습니다. 그래서 프로그래밍 방식으로 나는 당신도 그것을 할 수 있어야한다고 생각했다.하지만 나는 stdin에 대해 이야기하고있다. –

+0

작업자 스레드는 프로그램 흐름 제어에 대한 결정을 내려서는 안되며, 사용자 입력을 듣고있는 주 스레드에 의해 처리되어야한다. 주 스레드에 대한 코드를 게시 할 수 있다면 좀 더 모듈 방식을 제안 할 수 있습니다. –

답변

3

유닉스에서 스레드가 여러 항목 (예 : std :: in의 문자와 작업자 스레드의 명령이 종료되는 것을 알리는 명령)을 기다려야하는 경우 select()를 사용합니다. pipe() 시스템 호출로 파이프를 만들면 작업 스레드가 종료 할 때 쓸 수 있습니다 ... 현재 cin에서 대기중인 주 스레드는 select()를 호출하여 차단하고 적절하게 반응합니다. 때 깨어 났는지 ..

Windows에서, 당신은 아마 같은 목적으로 WaitForMultipleObjects()를 사용할 수 있습니다.

+0

u는 어떤 샘플 코드 나 포인터를 가지고 있어도 편리합니까? 내가 ACE라는 네트워킹 패키지를 사용하는 데 도움이된다면 (하지만 일단 ACE에서 어떻게하는지 검색하는 것이 쉬운 일이라는 생각이 들게됩니다) –

2

A "좋은"솔루션은 자신의 입력 함수를 작성하는 것, 즉 문자를 누를 경우, 유휴 다른 비 차단 및 검사입니다. 그 루프에서 해지 확인을 할 수 있습니다.

non-blocking keyboard input에 대해 읽어보십시오.

이외에도 스레드 라이브러리 및 운영 체제에 따라 플랫폼에 따라 여러 가지 솔루션이 있습니다. 그 정보로 질문을 확장한다면, 우리는 뭔가 제안 할 수 있습니다.

+0

이상적으로 나는 크로스 플랫폼 화 된 솔루션을 원합니다. 그러나 Mac OS X Snow Leopard에서 pthreads를 사용하고 있습니다 –

관련 문제