|
发表于 2017-10-26 13:44:44
|
显示全部楼层
多媒体定时器MmTimer的网上例子很多,你自己找吧,
下边是用线程死等的,可以做到很小的周期,但是比较耗资源,且周期不太稳定
- int pengding = 0;
- Thread trans_thread;
- private void CanTrans_Thread()
- {
- while (true)
- {
- int id;
- int dlc;
- long oldTime = DateTime.Now.Ticks;
- long nowTime;
- long time;
- long cnt;
- byte[] dat = new byte[8];
- bool rx_frame = false;
- int idle_counter = 0;
- while (true)
- {
- rx_frame = false;
- while (ReadData != null && ReadData(out id, ref dat, out dlc, out time) == true)
- {
- if (id == rx_id && dlc == 8)
- {
- /*
- ** Response Pending
- */
- if (dat[0] == 0x03
- && dat[1] == 0x7F
- && dat[3] == 0x78)
- {
- pengding = 5000;
- RxFrameEvent(id, dat, dlc, time);
- break;
- }
- pengding = 0;
- RxFrameEvent(id, dat, dlc, time);
- Array.Copy(dat, can_rx_info.frame, SF_DL_MAX_BYTES + 1);
- break;
- }
- }
- nowTime = DateTime.Now.Ticks;
- cnt = nowTime - oldTime;
- if (cnt >= 5000 || rx_frame)
- {
- oldTime = nowTime;
- if (pengding == 0)
- {
- CanTrans_Counter((int)(cnt + 5000) / 10000);
- }
- else
- {
- pengding--;
- }
- }
- if (pengding == 0)
- {
- CanTrans_Manage();
- }
- if (can_rx_info.rx_in_progress || can_tx_info.tx_in_progress || rx_frame)
- {
- idle_counter = 0;
- }
- else
- {
- if (idle_counter >= 100)
- {
- Thread.Sleep(5);
- }
- else
- {
- idle_counter++;
- }
- }
- }
- }
- }
- /// <summary>
- /// 传输层开启
- /// </summary>
- public void Start()
- {
- pengding = 0;
- can_tx_info = new tx_info();
- can_rx_info = new rx_info();
- trans_thread = new Thread(new ThreadStart(CanTrans_Thread));
- trans_thread.IsBackground = true;
- trans_thread.Priority = ThreadPriority.Highest;
- trans_thread.Start();
- testerPresentStart();
- }
复制代码 |
|