2014-02-26 2 views
0

그냥 입력을 기다리는 주 스레드와 다른 스레드가있는 프로그램을 만들려고합니다. 사용자가 freeze i을 입력하면 스레드 번호 i이 일시 중지되어 즉시 멈 춥니 다. 그런 다음 사용자가 continue i을 입력하면 스레드 i이 해당 작업을 반복합니다. 각 스레드의 (하지만 주된) 작업은 매 x 초마다 메시지를 인쇄하는 것입니다.windows에서 posix 알람을 대체하는 방법

프로그램은 결국 파이썬으로 작성되어야하지만 C 솔루션, 의사 코드 또는 일부 아이디어가 많이 도움이 될 것입니다!

저에게는 POSIX OS에서 수행하는 것이 매우 쉽습니다. 각 스레드 (기본 스레드)는 SIGALRM, SIGUSR1SIGUSR2에 대한 핸들러를 설정합니다. 또한 alarm(x)while (1): pause()으로 설정됩니다. SIGALRM 처리기가 메시지를 인쇄하고 alarm(x)을 설정합니다. SIGUSR1 처리기는 remaining_time = alarm(0)pause()을 설정하여 스레드를 일시 중지합니다. SIGUSR2 처리기는 alarm(remaining_time)을 설정하여 스레드를 계속 진행합니다. 메인 스레드는 freeze i을받을 때 SIGUSR1을 보내고 continue i을 받으면 SIGUSR2을 전송합니다.

하지만 Windows에서이 작업을 수행 할 수있는 방법을 찾을 수 없습니다. 이 일을 올바르게 수행하는 방법을 찾도록 도와주세요! 내가 알기로 POSIX를 사용하는 방식과 완전히 다르다.하지만 적절한 해결책을 찾지 못했다.

답변

0

옵션 1 (권장) 윈도우에서

, 당신은 단지 스레드를 일시 정지 SuspendThread를 호출해야합니다. ResumeThread 다시 깨우십시오. 그보다 더 쉽지는 않습니다.

-

옵션 내가 제대로 이해 2

, 당신은 당신의 UNIX 코드가 경보/신호 솔루션은 각각의 스레드에서 통지하기에 "자기 중지"를 가지고 본질적으로 주 스레드.

alarm(), pause(), signal() 대신에 SleepExQueueUserAPC을 함께 사용하십시오. 비동기 프로 시저 호출은 UNIX에서의 신호와 정확히 똑같지는 않지만 지금까지와 비슷하게 구현과 거의 일치합니다.

-

옵션 3

또 다른 해결책은 단지 각 스레드와 관련된 CRITICAL_SECTION 잠금을하는 것입니다. - 따라서 계속에서 스레드를 차단

Thread: 
while (true) 
{ 
    Sleep(remaining_time_in_milliseconds); 
    EnterCriticalSection(&cs); // enter lock 
    printf("message\n"); 
    LeaveCriticalSection(); // exit lock 
} 

는 "계속" "동결"과의 구현이 EnterCriticalSection()를 호출하는 것입니다 : 스레드 구현은 다음과 같을 것이다.

+0

감사합니다. 하지만 아직 작동하지 않습니다. 옵션 1 : 나는 SuspendThread가 핸들을 받으면서 파이썬에서 스레드에 대한 핸들을 얻는 방법을 찾고 있습니다.또한 MSDN에서는 "디버거가 아닌 응용 프로그램 내의 스레드가 다른 스레드에 신호를 보내서 신호를 일시 중단하도록 신호를 보내야합니다. 대상 스레드는이 신호를보고 적절히 응답하도록 설계되어야합니다"라고 말합니다. 신호로 무엇을 의미하는지 모르겠습니다. 아직 찾고있는 중. – user3356735

+0

옵션 2 : 올바르게 이해하고 있습니다. :) 그러나 나는이 기능들이 어떻게 도움이되는지를 정말로 이해하지 못한다. 옵션 3 : 몇 가지 문제가 있습니다. 내 생각에 : 스레드가 절전 모드에서 일시 중지되지 않습니다. EnterCriticalSection에서만 일시 중지됩니다. 이렇게하면 인쇄하기 전에 몇 초 기다려야하는지 알 수 없습니다. 예 : x = 10. 3 초가 지나면 사용자가 동결 상태가됩니다. 스레드는 잠자기 상태로 유지되고 잠금 장치에서 대기합니다. 사용자가 계속 호출하면 스레드는 남은 7 초를 기다린 후 인쇄하는 대신 즉시 메시지를 인쇄합니다. – user3356735

+0

@ user3356735 - alertable 플래그가 true로 설정된 SleepEx를 사용하십시오. SleepEx가 반환되면 남아있는 시간과 APC 콜백이 발생했는지 확인하십시오. 스레드가 일시 정지 신호를 받으면 깨우기 APC가 발생할 때까지 SleepEx (INFINITE, true)를 수행 할 수 있습니다. 잠에서 깨어 나면 다시자는 시간을 정할 수 있습니다. 빠르고 정확한 시간 함수로 GetTickCount()를 사용하십시오. – selbie

관련 문제