我正在创建一个多线程套接字程序,需要定期向服务器发送2组数据。客户端需要每3秒发送一次GPS信息,每4秒发送一次极性信息。实现它的想法是简单地创建一个新线程,创建一个无限循环,发送() GPS信息,休眠()1秒,发送()极性信息,然后睡眠()2秒。这样做是否足够呢?对不起,我刚开始使用套接字编程,所以我不知道其他的方法。
发布于 2014-12-07 17:32:38
你所建议的计划是:
发送GPS信息,睡眠1秒,发送极性信息,然后睡眠2秒。
在12秒的时间内,这将导致:
这将发送GPS信息4次(正确)和极性4次,每3秒发送一次,而不是按照规范要求每4秒发送3次。所需的顺序可能是:
请注意,在某一秒,GPS和极性都必须发送。
您可以通过两种方法中的任何一种来实现这一点。假设您需要使用线程,那么使用两个线程,一个在三秒等待,一个在4秒等待。协调对套接字的访问与互斥,以便在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秒),您也可以睡上几秒钟。
如果您需要避免漂移(因为上面的代码假设发送过程是瞬时的,而不是即时的),那么您必须使用亚秒睡眠,并在循环开始时捕获时间,并调整睡眠间隔以允许发送所需的时间。
https://stackoverflow.com/questions/27345239
复制相似问题