用VC++处理多个采集线程需注意的地方 点击:7459 | 回复:20



xiaolifeidao

    
  • 精华:28帖
  • 求助:0帖
  • 帖子:130帖 | 357回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2006-11-23 09:16:00
楼主

    若程序对线程对象需操作。如对线程对象产生的数据作统计、终止子线程再创建它、创建众多的多态的受主线程控制流程的客户模拟线程、主线程退出时先终止其创建的线程(优雅退出)等等,则必须注意以下情况。
    用VC++编工控程序,个人以为需打好扎实熟练的Windows高级编程技术。比方说工控程序中有许多采集线程。那么以下这种情况常常发生:主线程同时连续地打开多个线程,有的线程不满足循环条件立即退出。主线程后续连着创建其他线程。此时无足够的Windows高级编程及调试编码经验编出的程序往往会产生线程对象的悬浮指针。给调试带来了极大的难度。为起抛砖引玉的作用,笔者介绍本人提出自己的解决办法。
    
    
    必须在线程退出前置零本线程对象指针,如g_GetWeightProc = NULL;,以确定其已退出的状态。以后对其操作时先判断其是否为空。

    否则后续代码不知该对象已释放而继续对其处理就会出错。如分配时若一个线程A在另一个线程B分配前被释放,则两个CWinThread *指针会指向同一个CWinThread。 即pA == pB为TRUE,pA为悬浮指针。后续操做会出错。又比如一线程A已退出,而另一线程B未退出则因为线程对象A错误地指向线程对象B(分配线程对象B时形成)则判退出例程会以为线程A未退出。若此时主线程设线程对象A的退出标志为TRUE并等待其退出则程序进入死循环。即使pA 为悬浮指针但不指向任何线程对象,仍会出其他错,如CloseHandle(pTemThread->m_hThread)。程序可能会出现莫名奇妙的错误。


  若要使一线程退出并等待其退出可考虑用SendMassge等消息传递机制。或者采用结构化异常语句来控制流程(通过捕获线程对象NUUL指针),但其代码分布很松散不易维护,因为对悬浮指针还须其他地方避免。所以强烈推荐采用消息传递机制。

    必须对全局共享变量实施互斥保护,否则由于Windows的时间片轮转,仍会出现各种问题。容笔者不再獒述 
   可以看到工控程序多线程编程确实很需Windows编程,Windows OS知识。还需专注的调试。



chianrenshaoming

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 1回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2006年12月01日
发表于:2006-12-06 11:57:00
1楼
谢谢

小鸟一只

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 5回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2006年12月05日
发表于:2006-12-06 15:12:00
2楼
多谢~~

autoyx.com

  • 精华:0帖
  • 求助:0帖
  • 帖子:32帖 | 634回
  • 年度积分:0
  • 历史总积分:882
  • 注册:2005年9月27日
发表于:2006-12-08 14:36:00
3楼
多线程,多进程VC编程时工控软件常用的方法

hujie

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 80回
  • 年度积分:0
  • 历史总积分:168
  • 注册:2006年7月14日
发表于:2006-12-08 15:55:00
4楼
多谢~~

vysr

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 31回
  • 年度积分:0
  • 历史总积分:64
  • 注册:2007年6月05日
发表于:2007-06-29 11:04:00
5楼
曾试着使用CwinThread类,发现它限制太多,而且某些时候一用程序就莫名崩溃。后来就只用_beginThread(),觉着不仅方便而且稳定。用_beginThread()开了线程后就任其自生自灭,当然程序退出前需要先退出子线程。

赵军sh

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 15回
  • 年度积分:0
  • 历史总积分:68
  • 注册:2006年11月12日
发表于:2007-10-15 19:58:00
6楼
用VC++处理多个采集线程需注意的地方

    (若能注明出处,欢迎转载)
    若程序对线程对象需操作。如有时程序会终止全局子线程再创建它、对象产生的数据作统计、创建众多的多态的受主线程控制流程的客户模拟线程、主线程退出时先终止其创建的线程(优雅退出)等等,则必须注意以下情况。
    用VC++编工控程序,个人以为需打好扎实熟练的Windows高级编程技术。比方说工控程序中有许多采集线程。那么以下这种情况常常发生:主线程同时连续地打开多个线程,有的线程不满足循环条件(如相关的全局线程已开)立即退出。主线程后续连着创建其他线程。此时无足够的Windows高级编程及调试编码经验编出的程序往往会产生线程对象的悬浮指针。给调试带来了极大的难度。为起抛砖引玉的作用,笔者介绍本人提出自己的解决办法。
     必须在线程退出前置零本线程对象指针,如g_GetWeightProc = NULL;,以确定其已退出的状态。以后对其操作时先判断其是否为空。
    否则后续代码不知该对象已释放而继续对其处理就会出错。如分配时若一个线程A在另一个线程B分配前被释放,则两个CWinThread *指针会指向同一个CWinThread。 即pA == pB为TRUE,pA为悬浮指针。后续操做会出错。比如一线程A已退出,而另一线程B未退出则因为线程对象A错误地指向线程对象B(分配线程对象B时形成)则判退出例程会认为线程A未退出。若此时主线程设线程对象A的退出标志为TRUE并等待其退出则程序进入死循环。即使pA 为悬浮指针但不指向任何线程对象,仍会出其他错,如CloseHandle(pTemThread->m_hThread)。程序可能会出现莫名奇妙的错误。
  若要使一线程退出并等待其退出可考虑用SendMassge等消息传递机制。或者采用结构化异常语句来控制流程(通过捕获线程对象NULL指针),但其代码分布很松散不易维护,因为对悬浮指针还须其他地方避免。所以推荐采用消息传递机制。
    必须对全局共享变量实施互斥保护,否则由于Windows的时间片轮转,仍会出现各种问题。容笔者不再獒述 
   可以看到工控程序多线程编程确实很需Windows编程,Windows OS知识。还需专注的调试。
tasbbon@gmail.com
http://gkbc.bokee.com

tcs

  • 精华:0帖
  • 求助:0帖
  • 帖子:68帖 | 526回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2004年8月25日
发表于:2007-10-16 02:57:00
7楼
OPC是好的标准!同意!

小虫~~

  • 精华:0帖
  • 求助:2帖
  • 帖子:19帖 | 307回
  • 年度积分:0
  • 历史总积分:659
  • 注册:2007年2月02日
发表于:2007-11-04 09:25:00
8楼
不错~

蜡笔小新不吃青椒

  • 精华:0帖
  • 求助:0帖
  • 帖子:31帖 | 680回
  • 年度积分:0
  • 历史总积分:1240
  • 注册:2007年10月18日
发表于:2007-11-09 18:38:00
9楼
WIN操作系统消息线程机制,任务调度方法等当然重要了

毕竟你所有的应用程序必须运行在操作系统之上

LINUX系统就又不同了

天涯小子

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 235回
  • 年度积分:0
  • 历史总积分:391
  • 注册:2004年8月09日
发表于:2007-11-09 19:29:00
10楼
路过

lcyang

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2007年12月19日
发表于:2007-12-19 11:49:00
11楼
不错!

9pp

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2008年3月03日
发表于:2008-03-05 19:55:00
12楼
顶。

ranranplay

  • 精华:1帖
  • 求助:0帖
  • 帖子:18帖 | 382回
  • 年度积分:0
  • 历史总积分:773
  • 注册:2005年9月27日
发表于:2008-03-06 10:19:00
13楼
在多线程里调用函数也要注意。

几个线程不要同时调用一个函数。不然会死机。

云竹

  • 精华:0帖
  • 求助:1帖
  • 帖子:17帖 | 326回
  • 年度积分:0
  • 历史总积分:500
  • 注册:2008年1月30日
发表于:2008-03-19 14:21:00
14楼
谢谢

邓吉荣

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 51回
  • 年度积分:0
  • 历史总积分:574
  • 注册:2007年11月16日
发表于:2009-01-07 16:05:59
15楼
hao hao haohao haoh aoha ha

huxing178881793

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2010年8月09日
发表于:2010-08-16 21:40:15
16楼
受教了 受教了   系诶邪恶

andlu

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 107回
  • 年度积分:0
  • 历史总积分:333
  • 注册:2004年9月03日
发表于:2011-12-27 10:18:06
17楼


工程项目监控软件源码集

1.vb6开发的锅炉监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数据记录

和查询界面及相关报表功能,历史曲线查询。(下位机是西门子S7-200,以太网通讯)

2.delphi7开发的回转窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数

据记录和查询界面及相关报表功能。(下位机是OMRON CJ1G,以太网通讯)

3.VC++6.0开发的石灰窑监控软件完整源码,有登陆界面、操作界面、历史数据记录和查询界面、报警数
据记录和查询界面及相关报表功能,历史曲线查询。(数据源是OPC Server,报表纯手工编写,具有很大
的灵活性)。

目前都已经稳定运行在自控项目上了。这些源码稍作修改就可以应用在其他项目上。

有需要的请联系QQ:790013363

EMAIL:lgr980423@126.com  可以先运行打包安装文件,查看效果。有偿服务,非诚勿扰!

$$$$$$$$$$

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 88回
  • 年度积分:0
  • 历史总积分:88
  • 注册:2005年3月11日
发表于:2014-08-23 15:23:00
18楼

谢谢                 学习了

aassda

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 28回
  • 年度积分:0
  • 历史总积分:105
  • 注册:2017年11月14日
发表于:2018-07-18 13:58:23
19楼

感谢楼主分享,感谢感谢

acc200

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 83回
  • 年度积分:0
  • 历史总积分:110
  • 注册:2012年1月11日
发表于:2018-12-29 20:00:29
20楼
多线程,多进程VC编程时工控软件常用的方法



热门招聘
相关主题

官方公众号

智造工程师