发表于:2006/11/17 19:41:00
#0楼
用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等消息传递机制。或者采用结构化异常语句来控制流程(通过捕获线程对象NUUL指针),但其代码分布很松散不易维护,因为对悬浮指针还须其他地方避免。所以强烈推荐采用消息传递机制。
必须对全局共享变量实施互斥保护,否则由于Windows的时间片轮转,仍会出现各种问题。容笔者不再獒述
可以看到工控程序多线程编程确实很需Windows编程,Windows OS知识。还需专注的调试。
tasbbon@gmail.com
http://gkbc.bokee.com
若程序对线程对象需操作。如对线程对象产生的数据作统计、终止子线程再创建它、创建众多的多态的受主线程控制流程的客户模拟线程、主线程退出时先终止其创建的线程(优雅退出)等等,则必须注意以下情况。
用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知识。还需专注的调试。
tasbbon@gmail.com
http://gkbc.bokee.com
[此贴子已经被作者于2006-11-20 10:37:30编辑过]