111,126
社区成员
发帖
与我相关
我的任务
分享 class MyTimer
{
private Stopwatch stw = new Stopwatch();
public delegate void ElapsedHandler();
public event ElapsedHandler Elapsed;
private static Thread sendThread;
public bool Enabled = false;
private int _interval;
/// <summary>
/// 时间间隔(ms)
/// </summary>
public int Interval
{
get
{
return _interval;
}
set
{
_interval = value;
}
}
public void Start()
{
Enabled = true;
stw.Start();
sendThread = new Thread(new ThreadStart(DoSend));
sendThread.IsBackground = true;
sendThread.Start();
}
private void DoSend()
{
while (Enabled)
{
if (stw.ElapsedMilliseconds >= _interval)
{
if (Elapsed != null)
{
Elapsed();
stw.Restart();
}
}
}
}
public void Stop()
{
Enabled = false;
stw.Stop();
if (sendThread != null && sendThread.IsAlive)
{
Thread.Sleep(1);
sendThread.Abort();
}
}
}
设计方面,要不做 异步解析,你这种一条一定要多少字节的玩意是不通用的,如果一定要做同步,发送和接收部分一定要有时间间隔,接收完成后要校验接收情况后 再发送下一次,这样 肯定明显 达不到你的10s 1000次的要求。
你们老大叫你再改一下~sleep精读非常低的,再加上多线程调度的时间误差,收到600次很正常。
Thread.sleep(10)的意思是10Ms内不在接受系统优先级调度 10Ms以后才再次接受系统优先级分配 而10Ms以后 再系统再次重新分配也不一定有最高优先级立刻执行
ps:上面你自己也说了,你们的协议规定是modbus,那么我告诉你你到底差在啥地方,你差在把从连续的byte[]里把modbus协议的具体一条解析出来。还是那个比方:“水流”,一个modbus桶200字节,现在你一次触发涌过来500字节的水流,那么理论上他包含3个桶的数据(有完整的,有部分的,有头没尾,有尾没头),你应该根据modbus协议把他具体解析出来,而不是messages.Add(message)
System.Threading.Timer TimerItem; System.Threading.TimerCallback TimerDelegate = new System.Threading.TimerCallback(timerRead); TimerItem = new System.Threading.Timer(TimerDelegate, null, 0, 2000); 线程做循环 别用Timer 不然 你界面还有其他功能会 程序停止运行
[quote=引用 10 楼 ypfsmile 的回复:] sleep精读非常低的,再加上多线程调度的时间误差,收到600次很正常。谢谢答复,那么我怎么样才能每隔10ms采集一次数据呢?用timer吗? Thread.sleep(10)的意思是10Ms内不在接受系统优先级调度 10Ms以后才再次接受系统优先级分配 而10Ms以后 再系统再次重新分配也不一定有最高优先级立刻执行