本帖最后由 FireworksSH 于 2019-8-8 18:42 编辑
Labview初学者,甚至一些Labview老用户,常常会发现他们写的程序在某些情况下,例如等待外部设备反馈时、控制执行器作动时、进行大量数据采集时,无法及时响应用户对图形界面上按钮、菜单、图表等控件单击/双击操作。 这样的情况基本都是程序设计不合理导致的,所采用的程序结构不符合实际应用需求。 有些工程师特别偏爱while循环,不管什么任务都采用while循环来解决。一个while循环里放置了好多case结构,任何一个case里的任务执行时间超过用户能接受的最大响应延迟时间,都会导致你设计的软件无法及时响应用户操作。例如下面这个代码,我们以延时代表耗时等长的任务,在5S延时未完成以前,2S延时任务和无延时(立即响应的任务,例如弹出消息、保存简单文本记录、控制数字输出等)任务是不会被响应的。 有些工程师喜欢用事件结构,事件结构(event structure)是一个成熟和高效的用户操作处理结构。如果每个事件中处理的任务耗时很短,例如1秒之内就能解决掉,基本不会让用户感觉到软件响应不及时。但是如果事件中处理的任务耗时很长,超过了用户能接受的最大响应延迟时间,那么就存在同上面说的while循环一样的问题。在这个耗时长的任务完成之间,用户单击软件界面上的按钮不会有任何反应,并可能造成软件无响应;在耗时长的任务完成之后,之前单击按钮对应的事件才会被响应,而且前面多次单击会被多次响应,这种情况往往会造成一些意外发生。例如在下面的程序中,我们先单击Delay10S按钮,然后单击两次Pop Message按钮,你就可以看到上文描述的情况。
那么类似这样的,对用户操作不及时响应的问题,是否可以解决呢?答案是当然可以解决的。 用多线程与Labview提供的一些设计模式(例如Master-Slave、Producer-Consumer等)结合起来可以完美解决上文描述的问题。
苏香农将把“Labview多线程”这个主题分五次与大家分享、交流。欢迎微信订阅“传感测控物联网”获得相关知识。
|