2010-09-05 39 views
2

我通過sys/time.h中的setitimer函數在我的C++代碼中使用了一個定時器。這將SIGALRM信號映射到我的定時器處理程序方法。在此之後,我無法使用睡眠功能。我假設這是因爲睡眠也使用SIGALRM信號。你能提出解決這個問題的辦法嗎?通過setitimer使用定時器時使用Sleep()

感謝您的回覆。

+0

+1我相信我遲早會遇到這個問題。 – FireAphis 2010-09-05 04:54:22

回答

3

您可以嘗試使用select()作爲計時器。我不知道它是否使用SIGALRM,但它應該很容易測試。例如:

timeval t = {1, 0}; 

    select(0, NULL, NULL, NULL, &t); 
+0

ACE使用select來實現計時器,所以我想你的建議應該工作。 – FireAphis 2010-09-05 04:56:42

6

alarm(2)man page

sleep()可以使用SIGALRM來實現;將呼叫混合到alarm()sleep()是一個壞主意。

某些實現不使用SIGALRM,找到一個像這樣的機器,然後設置。否則,您可以嘗試nanosleep();它的安全實施。從nanosleep(2)man page

相比sleep(3)usleep(3)nanosleep()具有不影響任何信號的優勢,它是由POSIX標準,它提供了更高的定時分辨率,並允許繼續已中斷的睡眠通過信號更容易。

+0

nanosleep是要走的路。 – SkypeMeSM 2010-11-15 18:07:43

0

我會使用一個庫,提供這些OS服務的抽象。我使用ACE庫定時器和睡眠(ACE_OS::sleep,ACE_Reactor::schedule_timeout),他們一起工作沒有任何問題。據我所知ACE的定時器使用select。我猜boost::thread::sleepboost::asio::deadline_timer也會成功完成任務。

+0

不幸的是,我需要不使用任何第三方庫。我無法使用Boost或ACE :(。 – SkypeMeSM 2010-09-05 04:45:41

+0

好吧,那麼我想Carl剛剛給出了明確的答案:)(跑到他的崗位去投票)。 – FireAphis 2010-09-05 04:49:31