2014-12-07 129 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

相关问题