现在我们已经可以做到多进程化启动任务,要做到图形化控制进程,还需要做到以下几点:
(1)启动时显示进度条,完成时消失
(2)实时获取进程进度,并展示真实进度
(3)勾选后中止进程,进度条消失
笔者查阅了很多资料,发现要结合GUI做到信息的传递与实时显示是非常困难的,典型的进程通信方式有以下几种:
(1)信号量( semaphore ) : 信号量是一个共享资源访问者的计数器,可以用来控制多个进程对共享资源的并发访问数。它常作为一种锁机制,防止指定数量的进程正在访问共享资源时,其他进程也访问该资源。
(2)信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(3)管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系。
(4)有名管道 (named pipe) : 有名管道也是半双工的通信方式,但它允许无亲缘关系进程间的通信。
(5)消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(6)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的,往往与其他通信机制(如信号量)配合使用。
(7)套接字( socket ) : socket也是一种进程间通信机制,与其他通信机制不同的是,它主要用于不同机器间的进程通信,同一机器内的进程通信采用此方式是有些浪费的。
(8) 文件:使用文件进行通信是最简单的一种通信方式,一个进程将结果输出到临时文件,另一个进程从文件中读出来。
笔者尝试了以上好几种方式,但没有实现任务需求,前七种方式与GUI交互信息太复杂,而最后一种文件方式则无法顺畅读写,会遇到打开一个文件无法同时读写的问题,相比于寻找各个方法获取进程进度,笔者认为通过比较文本目前完成行数判断进度更为简单,而且进程池方式中不适合直接杀死进程,更合适的方法是结束通过标志提前中止当前任务,最后笔者找到了一种可行的方式:通过进程共享变量传递必要的参数。