请教MFC上位机程序,50个仪表,1个控制台(升源降源),采用多线程如何对仪表进行检测?

Michaellovekobe 2014-05-29 02:46:06
50个仪表放到控制台上,只有一个控制台。要做一个自动的MFC上位机程序,点一下按键,一直跑到完。软件能够自动的使控制台升源降源,然后与仪表通信,进行仪表的检测。控制台是一对多的,也就是50个仪表只能用一个控制台。这涉及到同步问题。下一步的检测只能是等待这一步所有仪表都检测完毕,才进行下一步(只能如此)。通信及控制台的控制、测试等不是问题。关键是能否用多线程,同时启动50个线程并发检测。

之前的做法是采用定时器的方式。设定全局变量timerno,timerno随定时器累加。每个timerno固定做特定的操作(即与仪表进行通信)。这样就能保证50个仪表是一致的。

这种方法的问题是,仪表是从设备,通信时有应答。应答的快慢不一致。所以只能按照最慢的应答时间等待,才能保证不超时。这样比较费时。比如有49个都是

在100ms应答,而有1个是在1000ms时应答。则必须用1000ms做最大等待时间。

现在想改成线程方式,即每个仪表收到应答后就进行下一步操作,各干各的,这样会节省时间。但如果遇到控制台的升源降源等一致性操作的时候,必须同步等待所有仪表完成上一步才行。

请问这两个方法哪个更好,50个线程的方案是否可行,该如何做?
...全文
521 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧童吃五谷 2014-07-02
  • 打赏
  • 举报
回复
搞一个小的PLC,例如S7-200,然后安装一个监控组态软件,如果货都到的话,估计1天搞定
Lingxy 2014-06-05
  • 打赏
  • 举报
回复
直接开51个线程就行了~反正大部分时间线程都是在Sleep的
schlafenhamster 2014-06-04
  • 打赏
  • 举报
回复
“到底是主函数给线程函数发消息,还是线程函数给主函数发消息” 都可以
Michaellovekobe 2014-06-04
  • 打赏
  • 举报
回复
引用 26 楼 Squall001 的回复:
[quote=引用 25 楼 Michaellovekobe 的回复:] [quote=引用 13 楼 schlafenhamster 的回复:] 这是线程函数与主函数的关系,线程函数是不退出的(while(1)), 主函数叫他 发, 它 就发, 发完 等 回答, 回答 给 主函数 后, 等 主函数下个 命令。
引用 22 楼 schlafenhamster 的回复:
那主函数在没收到消息之前,在干什么 等待所有的消息
消息驱动,到底是主函数给线程函数发消息,还是线程函数给主函数发消息?[/quote] 他说的这个消息 和你说的这个消息 完全就是两码事。[/quote] 不就是系统消息吗,windows消息。有什么区别,用自定义消息实现线程间通信
Squall001 2014-06-04
  • 打赏
  • 举报
回复
引用 25 楼 Michaellovekobe 的回复:
[quote=引用 13 楼 schlafenhamster 的回复:] 这是线程函数与主函数的关系,线程函数是不退出的(while(1)), 主函数叫他 发, 它 就发, 发完 等 回答, 回答 给 主函数 后, 等 主函数下个 命令。
引用 22 楼 schlafenhamster 的回复:
那主函数在没收到消息之前,在干什么 等待所有的消息
消息驱动,到底是主函数给线程函数发消息,还是线程函数给主函数发消息?[/quote] 他说的这个消息 和你说的这个消息 完全就是两码事。
Michaellovekobe 2014-06-04
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
这是线程函数与主函数的关系,线程函数是不退出的(while(1)), 主函数叫他 发, 它 就发, 发完 等 回答, 回答 给 主函数 后, 等 主函数下个 命令。
引用 22 楼 schlafenhamster 的回复:
那主函数在没收到消息之前,在干什么 等待所有的消息
消息驱动,到底是主函数给线程函数发消息,还是线程函数给主函数发消息?
Michaellovekobe 2014-06-04
  • 打赏
  • 举报
回复
引用 23 楼 afk_02 的回复:
不确定时间的等待,短CD高频查询应该可以减少不必要时间 另外仪表类总会出现不定期的'大姨妈',直到收到回应是不是有可能系统挂掉?
这个,我的解决办法是,有最大等待应答时间,如果超时则抛弃该仪表。
野生大猫 2014-06-04
  • 打赏
  • 举报
回复
不确定时间的等待,短CD高频查询应该可以减少不必要时间 另外仪表类总会出现不定期的'大姨妈',直到收到回应是不是有可能系统挂掉?
schlafenhamster 2014-06-04
  • 打赏
  • 举报
回复
那主函数在没收到消息之前,在干什么 等待所有的消息
schlafenhamster 2014-06-04
  • 打赏
  • 举报
回复
主函数 与 你的 工程类型 有关。 单文档, 对话框, win32 。。。
Michaellovekobe 2014-06-04
  • 打赏
  • 举报
回复
引用 22 楼 schlafenhamster 的回复:
那主函数在没收到消息之前,在干什么 等待所有的消息
我如何做这个主函数? 说的直白一点,一个按钮,我单击按钮,调用一个函数MainProc() MainProc()该如何写?是写一个while(1)循环吗?然后等着收到消息就做相应操作?
schlafenhamster 2014-06-03
  • 打赏
  • 举报
回复
这是线程函数与主函数的关系,线程函数是不退出的(while(1)), 主函数叫他 发, 它 就发, 发完 等 回答, 回答 给 主函数 后, 等 主函数下个 命令。
Michaellovekobe 2014-06-03
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
"50个仪表,50个端口。各自管各自的,独立的" 50个线程 可以 考虑。 自顾自 的。
、 谢谢! 还有,如果用线程的话,线程函数如何写呢? 因为做的操作比较多,即通信次数较多。一发一收可以用waitforsingleobject等待信号,那如果有20次通信,我的线程函数,是否用顺序结构,一个等待一个,也就说调用waitforsingleobject等待20次?
schlafenhamster 2014-06-03
  • 打赏
  • 举报
回复
"50个仪表,50个端口。各自管各自的,独立的" 50个线程 可以 考虑。 自顾自 的。
Michaellovekobe 2014-06-03
  • 打赏
  • 举报
回复
引用 8 楼 Squall001 的回复:
楼主 你这个 1个上位机挂50个 多半是用的总线吧,不会用50个端口吧。既然用的总线,就一次性发送所有查询吧,下位机应答回来都有地址什么的标志把,你通过地址来判断是哪个下位机返回来的数据。不知道你的总线协议和下位机是否支持判断总线忙活着空闲,然后占用总线等一系列协议。 你开线程也可以,如果你是多个端口的话 当然可以用多个线程,但是不要开太多,比如你要查询50个,你可以开10个线程 每个线程查询5个,但是这个都是基于你有多个端口的情况下的,如果你是总线,那么和下位机通信的只有1个端口,你就只有开一个线程。去发送接收, 你发送完了等待接收 用类似waitforsingleobject这种去等待即可,如果那边接收完了 就给信号让等待结束,马上就可以继续发 楼主还是说下接口环境,通信环境 才方便讨论问题
50个仪表,50个端口。各自管各自的,独立的。 但之前的人说开线程太多是不是不太好。50个线程会有问题吗? 还有,如果用线程的话,线程函数如何写呢? 因为做的操作比较多,即通信次数较多。一发一收可以用waitforsingleobject等待信号,那如果有20次通信,我的线程函数,是否用顺序结构,一个等待一个,也就说调用waitforsingleobject等待20次?
Michaellovekobe 2014-06-03
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
"当收到应答后" 就是一个事件. 50 个查询能不能 一起发出去(one by one), ? 然后等 应答 ?
一起发是可以的。应答等待时间有长有短。 现在考虑的是如何实现无等待发送,即上一次发送完成,如果等待应答了,马上发送下一次。 我现在是固定间隔2秒钟发送。确实是有时间上的浪费
Michaellovekobe 2014-06-03
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
线程发 消息给 主函数. 主函数不能waitforsingleobject,,, 界面会堵塞.
那主函数在没收到消息之前,在干什么?
Squall001 2014-06-03
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
线程发 消息给 主函数. 主函数不能waitforsingleobject,,, 界面会堵塞.
不然就会遇到上次我们讨论的问题。。
schlafenhamster 2014-06-03
  • 打赏
  • 举报
回复
线程发 消息给 主函数. 主函数不能waitforsingleobject,,, 界面会堵塞.
Michaellovekobe 2014-06-03
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
这是线程函数与主函数的关系,线程函数是不退出的(while(1)), 主函数叫他 发, 它 就发, 发完 等 回答, 回答 给 主函数 后, 等 主函数下个 命令。
我说的就是这个,岂不是主函数要waitforsingleobject等待线程的“事件”或者是“信号量”?
加载更多回复(12)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧