2014-09-10 115 views
-1

每x秒運行函數都有問題。 我的應用程序:每x秒運行函數

  1. 創建,綁定套接字,

  2. 監聽套接字上,

  3. 接受所有傳入連接,併爲他們每個人一個新的線程,

  4. 發送和接收一些數據,

  5. 現在在循環中應該發送數據每1.5秒,5秒和10秒。

我嘗試做這樣的(這裏的「時間」應該是時間以毫秒/納秒):

while(true) 
{ 
    if(fmod(time, 1.5)==0) 
    { 
     /*sending data*/ 
    } 
    if(fmod(time, 5)==0) 
    { 
     /*sending data*/ 
    } 
    if(fmod(time, 10)==0) 
    { 
     /*sending data*/ 
    } 
} 

當我使用time()數據每秒發送多次,因爲time()具有精度到一秒鐘。你能否給我建議我需要什麼功能來獲得高精度時間?

我使用Linux

問題2: 如何我可以(通過使用任意鍵也許)當線程運行結束程序?

+0

在初始化的時候,你說的是等於'std :: time(NULL)嗎?你能編輯你的問題,告訴我們這個變量的聲明嗎? – axelduch 2014-09-10 10:01:09

回答

1
  1. 你的方法不是很好。首先 - 你不能簡單地用浮點算術比較零。在返回零的操作中,您可能會得到0.0000000000001。其次 - 如果您的一個凍結一段時間,另一個發送將延遲。最後但並非最不重要的 - 在一段時間內循環會浪費CPU。您可以使用Linux定時器功能和異步IO。

  2. 結束多線程程序的最佳方法是捕獲一個信號(SIGINT或SIGTERM或任何您使用的)並停止所有線程,免費資源,然後退出。

2

1)那麼,要有更高分辨率的計時器,您可以使用clock_gettime,獲取實時時鐘的示例可以找到here

2)我會說這不是一個非常好的設計,爲什麼不使用一個定時器的恆定時間間隔,將重新安排1.5s,5s和10s的間隔時間,並執行發送?這樣你就不必阻塞主線程,並且可以等待鍵盤輸入或者做任何需要等待終止的操作。