5564|7

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince 下mfc变成如何改变常规定时器的优先级 [复制链接]

小弟最近在用mfc编程。用常规定时器定时接收串口中的数据,但是当我点击界面中其它按钮的时候,接收到的串口数据有丢失现象。请问可不可以把常规定时器的优先级设高一些,让其它如鼠标消息的优先级设低一些,从而使接收数据不丢失。

此帖出自WindowsCE论坛

最新回复

FLandY 你好! 我本来是用汪兵 那本书上用的方法,通过创建单独线程模拟重叠操作的方法,但是效果不好。我才用定时器的。暂时想不出更好的办法了。只能在接收数据的时候把其它按钮给屏蔽掉,等数据接收到需要的长度时,再使能其它按钮了! 没办法,只能暂时用这种笨方法了! 不过还是多谢各位大侠的无私指教!  详情 回复 发表于 2010-1-12 15:54
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
定时器好像没有优先级的说法.
建议使用开线程来处理串口数据.
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的接收方法有问题,如果不用通用的接收机制?
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(中级)

4
 
引用 1 楼 flandy1982 的回复:
定时器好像没有优先级的说法.
建议使用开线程来处理串口数据.


FLandY1982兄!非常感谢您的回复!我很多问题都得到您宝贵的建议!

我本来是用开线程开接收数据的,但是那串口端的发送频率太高,每一毫秒就有数据发生过来,所以要是我接收端在检测到有数据发生过来后就开启线程读取数据的话,机子就好像卡住了。所以我才用定时器定时接收缓冲中的数据的。
现在的问题是,普通定时器的不能修改优先级,在我点击其它按钮的时候,系统就执行其它任务了,从而使缓冲区满,引起数据丢失。其实其它操作是可以不用及时得到执行的。

不知道有什么方法可以解决这种问题?


此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 aleon_liao 的回复:
引用 1 楼 flandy1982 的回复:
定时器好像没有优先级的说法.
建议使用开线程来处理串口数据.


FLandY1982兄!非常感谢您的回复!我很多问题都得到您宝贵的建议!

我本来是用开线程开接收数据的,但是那串口端的发送频率太高,每一毫秒就有数据发生过来,所以要是我接收端在检测到有数据发生过来后就开启线程读取数据的话,机子就好像卡住了。所以我才用定时器定时接收缓冲中的数据的。
现在的问题是,普通定时器的不能修改优先级,在我点击其它按钮的时候,系统就执行其它任务了,从而使缓冲区满,引起数据丢失。其实其它操作是可以不用及时得到执行的。

不知道有什么方法可以解决这种问题?




不要实用同步操作,否则在有串口数据时, 接收线程会一直占用CPU,你的主线程就一直没有响应了。
使用异步操作。类似如下代码段:

  1. if(!ReadFile(m_hDev, &bReadTemp, 1, &dwReadSize, &overlapped)) {       
  2.                         if(GetLastError() == ERROR_IO_PENDING) {         
  3.                                 DWORD dwRet = WaitForSingleObject(overlapped.hEvent, INFINITE);
  4.                 m_eventRead.ResetEvent();
  5.                                 switch(dwRet) {
  6.                                 case WAIT_OBJECT_0:
  7.                                         if(m_bCloseReq) {
  8.                                                 CancelIo(m_hDev);
  9.                                         } else {
  10.                                                 bRead = GetOverlappedResult(m_hDev, &overlapped, &dwReadSize, TRUE);
  11.                                         }
  12.                                         break;
  13.                                 case WAIT_TIMEOUT:
  14.                                         TRACE(_T("Read Uart timeout."));
  15.                                         CancelIo(m_hDev);
  16.                                         break;
  17.                                 }
  18.                         } else {
  19.                                 bRead = FALSE;
  20.                         }
  21.                 }
复制代码

你可以看MSDN或者网上搜搜相关的技术文章看看。

个人意见仅供参考。
FLandY
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 91program 的回复:
你的接收方法有问题,如果不用通用的接收机制?


为何不用,不是如果不用
嘿嘿...
此帖出自WindowsCE论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
wince 不支持异步串口吧
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 flandy1982 的回复:
引用 3 楼 aleon_liao 的回复:
引用 1 楼 flandy1982 的回复:
定时器好像没有优先级的说法.
建议使用开线程来处理串口数据.


FLandY1982兄!非常感谢您的回复!我很多问题都得到您宝贵的建议!

我本来是用开线程开接收数据的,但是那串口端的发送频率太高,每一毫秒就有数据发生过来,所以要是我接收端在检测到有数据发生过来后就开启线程读取数据的话,机子就好像卡住了。所以我才用定时器定时接收缓冲中的数据的。
现在的问题是,普通定时器的不能修改优先级,在我点击其它按钮的时候,系统就执行其它任务了,从而使缓冲区满,引起数据丢失。其实其它操作是可以不用及时得到执行的。

不知道有什么方法可以解决这种问题?



不要实用同步操作,否则在有串口数据时, 接收线程会一直占用CPU,你的主线程就一直没有响应了。
使用异步操作。类似如下代码段:
C/C++ codeif(!ReadFile(m_hDev,&bReadTemp,1,&dwReadSize,&overlapped)) {if(GetLastError()== ERROR_IO_PENDING) {     
                DWORD dwRet= WaitForSingleObject(overlapped.hEvent, INFINITE);
                m_eventRead.ResetEvent();switch(dwRet) {case WAIT_OBJECT_0:if(m_bCloseReq) {
                        CancelIo(m_hDev);
                    }else {
                        bRead= GetOverlappedResult(m_hDev,&overlapped,&dwReadSize, TRUE);
                    }break;case WAIT_TIMEOUT:
                    TRACE(_T("Read Uart timeout."));
                    CancelIo(m_hDev);break;
                }
            }else {
                bRead= FALSE;
            }
        }
你可以看MSDN或者网上搜搜相关的技术文章看看。

个人意见仅供参考。
FLandY


FLandY 你好!
我本来是用汪兵 那本书上用的方法,通过创建单独线程模拟重叠操作的方法,但是效果不好。我才用定时器的。暂时想不出更好的办法了。只能在接收数据的时候把其它按钮给屏蔽掉,等数据接收到需要的长度时,再使能其它按钮了!
没办法,只能暂时用这种笨方法了!
不过还是多谢各位大侠的无私指教!
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表