2013-07-10 78 views
1

我想用戶輸入一個時間例如1400h - 這會導致一個函數在1400h運行。在某些時鐘時執行功能

我該怎麼做?

語境:我有一個客戶端 - 服務器程序在同一臺計算機上工作 - 我需要幾個節點同時發送消息(這是上面的功能)

編輯:我不想使用sleep()功能,理想的,因爲這個問題是客戶端將在不同的時間開始,它是非常簡潔的解決方案來調用的東西,導致在1400H執行功能。

+0

我相信有更多然後足夠的cron模塊C++。嘗試使用其中之一。 –

+0

你需要以某種形式調用sleep(),這是沒有辦法的。 – ronag

回答

1

如果程序正在運行的整個時間,使用函數如sleep等待現在和1400H之間的時間量。您可能需要做一個單獨的線程允許程序做其他事情,或者一個事件循環超時更換sleep(如果程序是事件循環爲基礎)。

如果程序必須退出,那麼您必須使用系統工具,如Unix上的at來安排要重啓的程序和要在指定時間執行的代碼。

+0

我不想使用'sleep(x)',因爲客戶端會在不同的時間啓動 - 但我希望它們在同一時間啓動。我會在問題中更新它! – sccs

+2

@sccs確切地說,這就是爲什麼'sleep(x)'中的'x'必須是現在到1400h *之間的*時間量。 – user4815162342

3

您可以使用std::this_thread::sleep_until,例如

void main() 
{ 
    auto fire_time = /**/; 

    std::thread thread([&] 
    { 
      std::this_thread::sleep_until(fire_time); 
      fire(); 
    }); 
    thread.join();  
} 

可以重構是爲輔助功能,這可能是你在找什麼:

template<class Func, class Clock, class Duration> 
void run_at(Func&& func, const std::chrono::time_point<Clock,Duration>& sleep_time) 
{ 
    std::thread(std::bind([&](const Func& func) 
    { 
     std::this_thread::sleep_until(sleep_time); 
     func(); 
    }, std::move(func))) 
    .detach(); 
} 
+0

我將如何使用這個 - 我有多個線程在程序中運行(並且我很新使用線程!)。我可以將我想調用的函數分離成單獨的線程,但是如何在特定的線程上調用'sleep_until()'? – sccs

+0

does't,「std :: this_thread :: sleep_until」回答你的問題?它將睡在「this」線程上,即調用函數的線程。 – ronag

0

我相信你需要某種任務管理器。這是一個基本模型。繁殖睡眠線是完成這項工作的非常錯誤的方法。一個經理會知道什麼時候開始下一個任務。如何運行任務是另一個問題。如果您希望它們互動,您可以爲每個任務創建新線程。或者你可以序列化它們並從管理器線程中運行。

相關問題