2014-12-07 128 views
0

我正在創建一個多線程套接字程序,需要定期向服務器發送兩組數據。客戶端需要每3秒發送一次GPS信息,每4秒發送一次極性信息。我的想法是簡單地創建一個新線程,創建一個無限循環,發送()GPS信息,睡眠()1秒,發送()極性信息,然後睡眠()2秒。這是否足以解決這個問題?對不起,我是套接字編程的新手,所以我不知道任何其他方法。定期從客戶端向服務器發送數據C

+1

我看不出爲什麼你的程序必須是多線程的。你的解決方案似乎很合理 – 2014-12-07 17:07:56

+0

每3秒發送一次極性信息,而不是每4秒發送一次。沒有;它不符合規範。假設你需要使用線程,使用兩個線程,一個等待三秒鐘,一個等待四秒鐘。使用互斥鎖協調對套接字的訪問,以便在12秒的倍數內,仍可以獲得理智的行爲。但是,您可以使用等待適當間隔的單線程進程完成所有操作。發送兩者之後,它會睡3,發送GPS,睡1,發送極性,睡2,發送GPS,睡2,發送極性,睡1,發送GPS,睡3,發送兩者。 – 2014-12-07 17:08:09

+0

'send'可能不會一次發送所有數據,因此您需要在每個'send'周圍進行循環。 – alain 2014-12-07 17:08:41

回答

1

你的提出的方案是:

發送的GPS信息,睡眠持續1秒,發送所述極性信息,然後睡2秒

在一段12秒,即導致:

  1. GPS;睡眠1
  2. 極性;睡眠1
  3. 睡眠1
  4. GPS;睡眠1
  5. 極性;睡眠1
  6. 睡眠1
  7. GPS;睡眠1
  8. 極性;睡眠1
  9. 睡眠1
  10. GPS;睡眠1
  11. 極性;睡眠1
  12. 睡眠1

這發出的GPS信息的4倍(正確的)和極性的4倍,並且每3秒,而不是3次,每4秒作爲規範要求。期望的序列可能是:

  1. GPS;極性;睡眠1
  2. 睡眠1
  3. 睡眠1
  4. GPS;睡眠1
  5. 極性;睡眠1
  6. 睡眠1
  7. GPS;睡眠1
  8. 睡眠1
  9. 極性;睡眠1
  10. GPS;睡眠1
  11. 睡眠1個
  12. 睡眠1

注意,在一些二,GPS和極性必須發送。

您可以通過兩種方法中的任何一種來實現此目的。假設你需要使用線程,使用兩個線程,一個等待三秒鐘,一個等待四秒鐘。使用互斥鎖協調對套接字的訪問,以便在12秒的倍數內,仍可以獲得理智的行爲。

int i_gps = 3; 
int i_pol = 4; 
int t_gps = 0; 
int t_pol = 0; 
int t_cur = 0; 

while (1) 
{ 
    if (t_cur == t_gps && t_cur == t_pol) 
    { 
     t_cur = t_gps = t_pol = 0; // Avoid integer overflow 
    } 
    if (t_cur == t_gps) 
    { 
     send GPS 
     t_gps += i_gps; 
    } 
    if (t_cur == t_pol) 
    { 
     send polarity 
     t_pol += i_pol; 
    } 
    sleep 1; 
    t_cur++; 
} 

您還可以通過改變代碼在循環的結束,以確定哪些發送睡多秒:

但是,你可以用單線程的過程,等待合適的時間間隔做這一切接下來睡覺適當的時間量,並將t_cur遞增適當的時間量(而不是一直使用1秒)。

如果你需要避免漂移(因爲上面的代碼假設發送過程是瞬時的,而不是),那麼你必須使用亞秒睡眠並捕獲循環開始時的時間並調整休眠間隔允許花費時間來完成發送。

+0

謝謝,我明白這一點,但GPS是3秒,極性是4秒僅僅是一個例子。如果GPS和極性間隔是其他任意值,我很難考慮如何實現這一點。 – marcusc 2014-12-09 14:54:19

+0

我顯示的代碼可以適應(或多或少)任意值的間隔('i_gap'和'i_pol'),僅受限於有效整數的範圍。它也可以概括爲處理任意數量的消息類型,只需要小心一些,並且可以使用一些函數指針。如果您有4秒和8秒的間隔,但您希望4秒鐘的操作發生在0,4,8,12,16,20時......您需要考慮更加困難,而您需要8秒鐘的操作發生在2,10,18,... – 2014-12-09 15:13:06

相關問題