VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 244|回复: 14

[已解决]请教一个多线程问题。

[复制链接]
34_avatar_middle
最佳答案
0 
在线会员 发表于 2020-2-29 10:01:12 | 显示全部楼层 |阅读模式
请教几个多线程问题,请高手指教一下,非常感谢,老大有空的话能看一下就更好了,因为是模仿老大的教程做的。
问题如下:
1.我做了一个程序,是读串口发过来的数据,然后处理,串口数据是没时间规律的发,所以一直得监听着。
   这样第一个问题来了,串口的打开是在线程外合理吗?因为有打开失败的情况,所以在初始化中打开了,程序关闭时关闭了串口。
2.第二个问题,有两个按钮,一个是创建线程,一个是结束线程。因为线程中我用了一个while(true)循环,所以结束线程用了syc
   说的最不推荐的结束方式TerminateThread()函数。
3.给线程传参数的时候申请了内存,但在线程中根本没机会释放。因为while(true)循环一直在监听着数据。
4.第四个问题是不会把接受到串口数据发给主窗口。主要是不知道怎么给SendMessage()传参数。

因为我自己感觉我写的东西非常不合理,但也没更好的解决办法。所以求助一下
请老大给予些帮助吧,非常感谢!
最佳答案
87_avatar_small
2020-3-1 19:55:55
本帖最后由 cqzj70 于 2020-3-1 19:58 编辑
david2020 发表于 2020-3-1 19:29
看了你的回复我一下子蒙圈了,因为我还只是初学,你说的这个我真的没有理解。我是看了syc的多线程教程照 ...


简单的说就是串口有数据就会产生一个事件,然后通知你这个读的线程取读数据,而这个事件要先用SetCommMask设置好,用WaitCommEvent()来等待事件的发生,当事件发生了就开始读,这样实时性就更高,WaitCommEvent()函数有点类似WairForSingleObject

https://blog.csdn.net/wlk1229/article/details/52566701

OffsiteEnforcement.rar

133.51 KB, 下载次数: 1

代码





上一篇:小白初学,想找个前辈带,
下一篇:一个简单的循环想不通
77_avatar_middle
最佳答案
31 
online_vip 发表于 2020-2-29 12:41:05 | 显示全部楼层
1、在线程外打开个人觉得问题不大,可以的!
2、结束线程的时候可以先给线程发个信号,等待1秒钟,如果之后线程还是没结束再调用 TerminateThread 强制结束比较好;
3、 循环条件最好别写死成 true,最好有个标识状态的变量来控制是否退出循环;
4、看看窗口的自定义消息就行了。

以上这些在 Syc 的教程中都有讲解!
可以参考:
《VC++高级班之多线程》:https://www.cctry.com/forum-129-1.html
《VC++高级班之窗口篇》:https://www.cctry.com/forum-131-1.html
87_avatar_middle
最佳答案
11 
在线会员 发表于 2020-2-29 14:41:55 | 显示全部楼层
其实这种问题也可以采用定时器来采集数据,可以避免采用多线程带来的复杂性!
85_avatar_middle
最佳答案
3 
在线会员 发表于 2020-2-29 17:24:48 | 显示全部楼层
多线程  控制有  系统信号函数CreateEvent SetEvent  WaitForSingleObject WaitForMultipleObjects
                      iocp函数  GetQueuedCompletionStatus  PostQueuedCompletionStatus
                      全局变量
                      共享内存
                      之类的
34_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-1 09:16:07 | 显示全部楼层
cqzj70 发表于 2020-2-29 14:41
其实这种问题也可以采用定时器来采集数据,可以避免采用多线程带来的复杂性!

不能采用定时器,因为要立刻处理获取的串口数据,定时器定时间太短也不好
87_avatar_middle
最佳答案
11 
在线会员 发表于 2020-3-1 10:58:26 | 显示全部楼层
本帖最后由 cqzj70 于 2020-3-1 11:00 编辑
david2020 发表于 2020-3-1 09:16
不能采用定时器,因为要立刻处理获取的串口数据,定时器定时间太短也不好


当年我初次使用是在公司老大下指导开发的我也是这种想法,在上位机里也是准备用多线程,老大说多线程调试麻烦,不如用定时器,在上位机用时间短了采集不到,时间长了丢包,结果我们采用的是200ms,完美的解决了。
34_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-1 14:47:27 | 显示全部楼层
cqzj70 发表于 2020-3-1 10:58
当年我初次使用是在公司老大下指导开发的我也是这种想法,在上位机里也是准备用多线程,老大说多线程调 ...

我这个是这样,我是获取车辆的数据,200ms的情况下,车速72km/h时,1秒就是20米,200ms就是4米,车牌都抓不上了
34_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-1 16:00:54 | 显示全部楼层
Health 发表于 2020-2-29 12:41
1、在线程外打开个人觉得问题不大,可以的!
2、结束线程的时候可以先给线程发个信号,等待1秒钟,如果之 ...

1,3, 你说的我懂了。
2,不知道怎么给线程发信号
4,你直接给我说把串口数据类似这样的数据UCHAR strRWBuff[1024]
     例: FF 01 08 26 07 E4 01 0A 0A 1E 07
     如何转化成lParam好吗?
87_avatar_middle
最佳答案
11 
在线会员 发表于 2020-3-1 16:55:42 | 显示全部楼层
本帖最后由 cqzj70 于 2020-3-1 17:02 编辑
david2020 发表于 2020-3-1 16:00
1,3, 你说的我懂了。
2,不知道怎么给线程发信号
4,你直接给我说把串口数据类似这样的数据UCHAR strRW ...


不知道你那个是不是采用的MODBUS协议,如果是就有一个字节会告诉你要读多少字节需要读取,然后在读取转换就是了呀,而且驿站有多线程教程,有这些知识
87_avatar_middle
最佳答案
11 
在线会员 发表于 2020-3-1 17:00:17 | 显示全部楼层
本帖最后由 cqzj70 于 2020-3-1 17:44 编辑
david2020 发表于 2020-3-1 14:47
我这个是这样,我是获取车辆的数据,200ms的情况下,车速72km/h时,1秒就是20米,200ms就是4米,车牌都抓 ...


你自己没有建立一个缓冲池当然就这样,还有这个时间你自己可以调节呀,因为传输协议如果不一样,读写时间肯定不一样的
87_avatar_middle
最佳答案
11 
在线会员 发表于 2020-3-1 18:26:05 | 显示全部楼层
本帖最后由 cqzj70 于 2020-3-1 18:47 编辑
david2020 发表于 2020-3-1 16:00
1,3, 你说的我懂了。
2,不知道怎么给线程发信号
4,你直接给我说把串口数据类似这样的数据UCHAR strRW ...


你还说不知道怎样给线程发信号,用SetCommMask这个函数设置读写事件,在调用SetCommMask函数之后,调用WaitCommEvent函数来等待事件的发生。打开串口后首先主线程要设置要监视的串口通信事件,然后将监视线程打开,用来监视主线程设置的这些串口通信事件是否已发生,当其中的某个事件发生后,监视线程马上将该消息发送给主线程,其中监视线程在发送消息之前要确保主线程在收到消息后肯定的知道串口究竟发生了什么样的事件,然后根据不同的事件类型进行处理。
34_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-1 19:29:29 | 显示全部楼层
cqzj70 发表于 2020-3-1 18:26
你还说不知道怎样给线程发信号,用SetCommMask这个函数设置读写事件,在调用SetCommMask函数之后,调用 ...

看了你的回复我一下子蒙圈了,因为我还只是初学,你说的这个我真的没有理解。我是看了syc的多线程教程照猫画虎做的,其实我的程序要实现的功能说起来很简单,就是要实时性高。功能就是接受一个串口的数据,只要串口有数据发过来了就马上处理,我的思路就是开启一个线程(因为也是看了syc的课程说开个线程会避免卡顿)写个一直循环的while语句读数据,只要有数据了就给主窗口发个自定义消息,然后在自定义消息中处理数据,我就是对自己写的程序没一点信心,让syc帮我看看有什么验证缺陷没有,看了各位大哥的回复,小弟真的一下子蒙了,不知道怎么做好了。
34_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-1 19:34:38 | 显示全部楼层
cqzj70 发表于 2020-3-1 16:55
不知道你那个是不是采用的MODBUS协议,如果是就有一个字节会告诉你要读多少字节需要读取,然后在读取转 ...

我不知道你说的这个协议啊,我的读这段代码是网上找的,总之我测试了,能读取到数据,字节个数是能知道的
87_avatar_middle
最佳答案
11 
在线会员 发表于 2020-3-1 19:55:55 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 cqzj70 于 2020-3-1 19:58 编辑
david2020 发表于 2020-3-1 19:29
看了你的回复我一下子蒙圈了,因为我还只是初学,你说的这个我真的没有理解。我是看了syc的多线程教程照 ...


简单的说就是串口有数据就会产生一个事件,然后通知你这个读的线程取读数据,而这个事件要先用SetCommMask设置好,用WaitCommEvent()来等待事件的发生,当事件发生了就开始读,这样实时性就更高,WaitCommEvent()函数有点类似WairForSingleObject

https://blog.csdn.net/wlk1229/article/details/52566701

34_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-1 21:37:40 | 显示全部楼层
cqzj70 发表于 2020-3-1 19:55
简单的说就是串口有数据就会产生一个事件,然后通知你这个读的线程取读数据,而这个事件要先用SetCommMa ...

非常感谢!代码已经下载,我测试学习一下后有疑问了再向你请教。
总之非常感谢。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-29 16:28

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表