9103|23

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

纠结,关于wince 一些线程问题 [复制链接]

最近整疯了,都怪太理想化,把wince下的程序当当裸奔程序来调试。

是这样的,串口接收线程ReadFile一次物理串口数据以后,就用PulseEvent函数来通知另外一个线程去copy 串口线程ReadFile的数据,开始在PulseEvent之后有个sleep(100),这样copy 串口线程ReadFile的数据的线程就能正常触发,可是当我把PulseEvent之后sleep(100)屏蔽之后,这个copy 串口线程ReadFile的数据的线程就不能正常触发了,要执行三次PulseEvent才能触发,低于三次都不能,怎么回事按照道理,既然已经通知了,应该触发是迟早的事情啊,
这样这个线程的效率也太低了吧。在串口读取数据线程加入sleep本身是不合理的行为,因为串口GPS一秒钟就发接近1K byte的数据过来,可想而知加入sleep(100)是必须丢数据的,


现在相当的纠结,要保证800 byte 这样不丢数据。搞了几天也解决不了。着急了,特来求救,各位有什么看法?

最新回复

欢迎加入 wince群 35526208。知道必答 哈哈。  详情 回复 发表于 2010-5-21 23:05
点赞 关注

回复
举报

8

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
搞定了,用我的土鳖方法。
发了博客,结贴。
http://blog.eeworld.net/gooogleman/archive/2010/05/22/5615844.aspx
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不懂,帮顶。。。
goooleman回复过我的帖子很多次,支持一下!!!

看来学习wince掌握大量的API函数是很有必要的!!!
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
把sleep(100)改为sleep(10)也是没有用,
线程倒是能响应。可是就是会丢数据以及数据被截断的现象。

哎,这个中间转换层真是难做。

哎纠结啊。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
http://topic.eeworld.net/t/20060622/19/4837830.html这个帖子现象 感觉有点类似。。有点。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,我是来顶贴的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用楼主 gooogleman 的回复:
是这样的,串口接收线程ReadFile一次物理串口数据以后,就用PulseEvent函数来通知另外一个线程去copy 串口线程ReadFile的数据,开始在PulseEvent之后有个sleep(100),这样copy 串口线程ReadFile的数据的线程就能正常触发,可是当我把PulseEvent之后sleep(100)屏蔽之后,这个copy 串口线程ReadFile的数据的线程就不能正常触发了,要执行三次PulseEvent才能触发,低于三次都不能,怎么回事按照道理,既然已经通知了,应该触发是迟早的事情啊,
这样这个线程的效率也太低了吧。在串口读取数据线程加入sleep本身是不合理的行为,因为串口GPS一秒钟就发接近1K byte的数据过来,可想而知加入sleep(100)是必须丢数据的,


这里纠正一下错误。红色部分有误,我刚才搞错了,没有sleep也能触发的,不过还是接收数据不行,效率太差。
到了500 多个byte 一秒都会有数据延迟的现象了。

主要是应用程序响应太慢。

这个现象是在虚拟串口驱动中的。


纠结现在搞得很难解决。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 cxz003 的回复:
http://topic.eeworld.net/t/20060622/19/4837830.html这个帖子现象 感觉有点类似。。有点。。

目前证实不是这个的原因了,是应用程序效率问题。
跟不上虚拟串口。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
我发现论坛的本意是交流的地方,不过发展久了就成了提问与被提问的地方,而且论坛只适合入门的人,再高了就没人能作为被提问者了。。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
改成Sleep(0)看一下,这样可以在接收完数据之后立刻将接收线程的时间片放弃,立刻进入线程调度,copy线程应该就可以立刻得以运行。
 
 
 

回复

3

帖子

0

TA的资源

禁止访问

11
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
新人劫分升星。。。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
没太看明白,
你一个线程是在接收串口信息,另一个所谓的copy串口线程是做什么工作?你是用Event来同步线程,对吗?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 yashi 的回复:
没太看明白,
你一个线程是在接收串口信息,另一个所谓的copy串口线程是做什么工作?你是用Event来同步线程,对吗?

恩。是的。我是做个驱动,去获得物理串口数据,然后应用去操作这个驱动,效率上不去,数据量到了500 byte 多就不稳定了。

我正在想办法解决,不要紧,一定会解决的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
建议 LZ 可用 Point-to-Point Message Queues 来做 Thread 之间的资料传输 (http://msdn.microsoft.com/en-us/library/aa908791.aspx).

Paul, Chao @ Techware
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
这个方法没有问题呀,一般都是用一个环形FIFO队列,接收线程在队列达到一定程度时候 pulseevent 通知处理线程从队列中取数据然后处理,并且处理线程每隔一段时间,比如100ms去检查一下队列里面有没有数据
如果你每收到一个数据就 PulseEvent 那就没什么意义了,频繁的切换线程,基本上和在接收线程里直接处理数据差不多.
对于GPS这种有意义的数据就更简单了,接收线程可以一边接收一边判断,当收到一条完整的GPS语句的时候,再通知处理线程来获取数据,好像GPS语句都是\r\n结尾的吧.
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 13 楼 paul_chao 的回复:
建议 LZ 可用 Point-to-Point Message Queues 来做 Thread 之间的资料传输 (http://msdn.microsoft.com/en-us/library/aa908791.aspx).

Paul, Chao @ Techware

这个方法不熟悉,不过Paul,chao老兄的话就是真理,嘿嘿,以后有空试试。
经过千万次的纠结,已经解决了这个问题,并且性能堪比真实的物理串口,庆祝一下。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 14 楼 reallyu 的回复:
这个方法没有问题呀,一般都是用一个环形FIFO队列,接收线程在队列达到一定程度时候 pulseevent 通知处理线程从队列中取数据然后处理,并且处理线程每隔一段时间,比如100ms去检查一下队列里面有没有数据
如果你每收到一个数据就 PulseEvent 那就没什么意义了,频繁的切换线程,基本上和在接收线程里直接处理数据差不多.
对于GPS这种有意义的数据就更简单了,接收线程可以一边接收一边……


恩。PulseEvent 不行,这样不适合。
毕竟不是真的中断。
现在采用WaitForSingleObject(g_hEventComm,500) 解决,真牛,这个比那个性能好了很多。
当然除此之外,我还做了别的处理。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
发现在一个论坛不能一直用一个号,混的等级太高了容易被关注,呵呵
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

20
 
头像终于换过来了,可是我的昵称为什么还不显示呢,郁闷。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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