- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
数据传输进程子面板
Tcp传输文件夹的任务也完成了,想要把程序做的完美一点,于是想起了win8中在copy文件或文件夹时的传输进程面板,显示了要从何位置传输多少文件到何位置,已传输多少的进度条还有显示实时速度和平均速度的图标,于是我借鉴了win8的做法,想要实现这样一个功能,使得数据传输过程更加清晰。下图为win8系统传输文件的面板
二.
做一个一样的子面板并不难,然而子面板和主程序的通信与控制将成为重点。类似于上面的面板,子面板需要以下的数据信息:被传输的文件(或文件夹)名称,数量,绝对路径,接受的它的IP地址,当前已传输的比例,实时传输速度,平均速度。以上信息都要通过主程序传输给子面板,传输方式就是我上一篇文章中讲到的队列。
三.
程序的程序设计思路框图没什么可说的,就是在tcp的传输子循环中把生成的上面所需要的信息组成一个簇以队列的方式发送给子面板,子面板经过相关计算后显示在子面板的前面板,主程序接收后同时关闭子面板即可,下面分别说以下每一部分的具体程序框图。
1.
首先主程序中通过一系列的数据组合,还有类似已传输量,总运行时间,这些数据都需要通过移位寄存器进行累计,最后组成一个簇,然后发给队列,这个簇包含以下信息(按顺序叙述):已传输文件个数,初始时间(开始传输的计时时间),文件路径,客户IP地址,文件个数,文件总量(B),已传输总量(B),每次传输量形成的数组,实时速度(发送每一小段的速度)构成的数组,当前时间(计时器计时的当前时间);
接下来用队列发送数据给子Vi,队列的数据格式为簇的格式,同时我们需要设定该循环停止的条件就是n个文件中的n-1个文件已经传输完毕,并且第n个结束传输信号为真,这样就关闭子Vi,然后关闭该循环。
2.
经过设计,子面板的主界面如下图所示
上图中进度条和图标显示的很明白,其中两个蓝色按钮本来是模仿win8中的两个按钮分别用来暂停传输和取消传输的,但是由于程序目前还木有做这一部分,所以这个问题以后再说,两个按钮左边的空白就是显示从何处传输何数据给何地址的空白,下面对后面板程序做一简单说明。
其他的数据大多是直接传输显示的,还有几个例如平均速度,文件路径等是经过了一定的处理后在界面上显示的,而图表相对麻烦一点
图表的x轴是已经传输的百分比,总长为100%,这需要把每一小块传输结束后所传输的总量用数组保存,然后通过一个for循环让数组的每一个值除以总的需要传输的量就是x轴的数据;而y轴显示的是x轴所对应的每一小块传输的时候的实时速度,然后也将它们累计起来成一个数组作为xy图的y输入数组即可,这一部分实现以以后程序就基本结束了。 [p]
四.
程序编程完毕进行测试的时候其实遇到了很多问题,让人很郁闷,后来慢慢滴调试修改,最终还是解决了这些问题,程序运行也得到了一个满意的答案,下面先给出程序运行的效果吧
A.局域网传输系统服务器主界面:包含已发送信息浏览,文件路径选择,端口号设置等,并可以通过开始按钮开始传输;
B.传输程序时主界面运行效果,弹出子面板显示实时信息;
C.下两个图为传输某两个文件夹时的进程子面板的效果图。
传输效果虽然不错,但在路上却遇到了很多问题,下面就将这些小问题一一说明。
(1)主界面上银色多列列表框在开始的时候总是只能显示第一列的内容,虽然通过项名的属性节点添加了好几项内容,但始终只显示第一项,最后我通过在第一列右击选择在前面插入列的方式生成了足够的列,然后又将曾经的第二列及以后的列全部推到了后面隐藏起来,这才解决了这个问题,原因我不晓得,更不明白NI这是何意。当然其实也可以通过其他形式的多列列表框来实现就不会这样子了;
(2)多列列表框想要在某一列的某个单元格加入符号,为什么都加到了第一列去,有没有人知道这是为什么,有没有办法加到后面的列;
(3)一开始的时候程序将数据传输完毕后总是无法停止运行,而且也没有关闭子vi,我觉得是子Vi循环的问题,但是好像问题也不大,判断条件也是对的,最后没办法自己随便试的,然后在队列发送数据给子Vi的循环中加了一个顺序结构,如下图所示
也就是先让子Vi接收数据并运行完毕,然后判断该循环是否终止,然后程序就好了,有没有人能解释一下具体的原理,我自己想可能是不加顺序的时候该循环运行状态和子Vi运行状态想出现了矛盾的地方,具体也说不清楚;
(4)xy图是个比较蛋疼的东西,它无法保存先前显示的数据,我本来想只要通过一个循环加移位寄存器就可以将xy图每次显示后将先前的状态保持下来,这样每次传进来一个点的数据在后面接着显示岂不完美,结果运行的时候图表一片空白,原来它只是每次都你传进来的数据重新刷新显示一边,所以最后不得不采用数组的形式,每次把刷新的数组值给xy图让它不停滴重新绘图;
(5)最后来说一下,对于这种实时更新的子Vi,如果你要通过队列的方式将数据在主Vi中传递给子Vi的数据输入端,子Vi是万万不要加总体的循环的,尤其是while循环,因为主程序进入子Vi后会在子Vi运行完毕后才再次回到主程序,这就可能造成子Vi进入循环,程序就停在子Vi出不来了,所以做程序的时候对于信号和数据流通传输过程要很有数才好。
五.
上一篇:创建虚拟通道时应当注意的基本问题
下一篇:二维布尔控件的状态保持