易语言-多线程之精易模块

 

在官方的多线程支持库中并没有涉及到线程的暂停及恢复,这里给大家演示下精易模块当中的挂起和恢复。

创建一个线程

使用到的命令:精易模块当中的线程_启动命令。

1
2
3
4
说明:创建一个线程,成功返回线程句柄,失败返回0。返回值类型为整数型。
第一个参数:要启动的子程序。数据类型为子程序指针。
第二个参数:要传入子程序的参数。数据类型为整数型。往子程序里传递一个整数型的参数。
第三个参数:线程ID。数据类型为整数型。请提供一个整数型的变量,用来存放新创建的线程ID。

线程挂起

线程挂起就是让一个线程暂停,需要提供线程句柄。

用到的命令:精易模块中的线程_挂起命令。

1
2
说明:将指定线程的执行挂起,注意,同一个线程可以被挂起多次,如果挂起多次,就要恢复多次。
参数:线程句柄。数据类型整数型。传入要等待的线程句柄。

通过上图可以看出线程只执行了一部分就被挂起了,后面的没有执行。

如果想要将这个线程恢复,可以用精易模块中的线程_恢复命令。

线程恢复

用到的命令:精易模块中的线程_恢复命令。

1
2
说明:恢复执行挂起的一个线程。返回值类型为整数型。成功返回1。
参数:线程句柄。数据类型为整数型。

如果线程被挂起了多次就要恢复多次,如挂起两次就要恢复两次,否则线程也不会执行。

这就是线程比较独特的地方,可以多次被挂起,每挂起一次计数就会加1,当恢复的时候就是将计数减1。

等待线程结束

因为线程执行起来的时候并不是和线程_启动命令相关联的,只是启动了这个线程,什么时候执行完并不知道,这里就可以使用线程_等待命令等待指定的线程执行完。

用到的命令:精易模块中的线程_启动命令。

1
2
3
说明:等待一个线程,返回真表示线程运行结束,返回假表示已超时。返回值类型为逻辑型。
第一个参数:线程句柄。数据类型为整数型。
第二个参数:超时。数据类型为整数型。允许接收空参数数据,留空,则无限等待。

注:因为等待并不是一直去等待的,需要设定一个超时时间,如果超时后就表示这个线程超时了,不能继续等待了。

如果这个线程中恰好有一个死循环,而线程外面又一直在等待,这样就永远也结束不了。可以根据需要设置一个超时时间。

注:等待线程结束超时后并不会将线程强制结束,还是会继续执行的。

如下代码线程_等待超时设置了6秒,但是线程里面有一个延时10秒,这时这个线程是不能在6秒内执行完了,超时后这个线程_等待命令就不起作用了。

超时后一般都是手动去销毁线程的。

线程销毁

用到的命令:精易模块中的线程_销毁命令。

1
2
说明:强制终止正在运行的线程,成功返回真,失败返回假。返回值类型为逻辑型。
参数:线程句柄。数据类型为整数型。

注:手动销毁线程后,线程里面的一些资源是不会被释放掉的,只有迫不得已需要销毁的时候才去手动销毁,否则还是应该等待线程自己退出。

手动销毁线程是不推荐去使用的,只有执行完在是线程最好的退出方式,所以优先要线程自己结束,其次才是手动销毁。

强制销毁内存是回不到刚开始的状态的,实际上这里有一点点内存泄露的,如果长时间大量的这样销毁线程,那么内存泄漏的就比较多了,这里是需要注意的一点 。

关闭线程句柄

需要在关于线程的一切操作结束后将线程句柄关闭掉,因为我们销毁掉这个线程之后线程句柄还是存在的,必须手动去关闭线程句柄。

用到的命令:精益模块中的线程_关闭句柄命令。

1
2
说明:关闭一个线程句柄,关闭后线程继续运行,但无法对该句柄进行操作。返回值类型为逻辑型。
参数:线程句柄。数据类型为整数型。

小问题:延时会卡程序吗?

延时就是相当于暂停,会在线程中延时指定的时间,相当于使用了线程挂起,当延时结束后就相当于使用了线程恢复。

当使用延时后当前线程就会被暂停掉,这时CPU就不会调用它了,是不会消耗CPU的资源的。

用到的命令:系统核心支持库中的取现行时间命令。

1
说明:返回当前系统日期及时间。

如果在主线程中使用延时命令是会卡住界面的,因为主线程被挂起了。

比如添加一个按钮,在按钮被单击事件中加一个延时,这时点击这个按钮窗口就会被卡住,因为窗口控件的事件都是在窗口的进程中或者说是在窗口的主线程中去执行的。

每一个窗口下面都有一个用来消息处理的线程,这个线程被挂起后在操作其它的是不会有反应的,因为被挂起了,当延时结束后就会恢复。

所以有的时候是不能直接调用延时命令的,大家可以使用精易模块中的程序_延时命令,这个命令是不会卡界面的,因为它是以定时器的方式实现的,当时间过去后才触发下面的事件,不会将当前线程挂起。

用到的命令:精易模块中的程序_延时命令。

1
2
3
说明:延时指定的时间。不占用cpu,窗口不卡死,不影响其它代码执行。返回值类型为逻辑型。
第一个参数:延时间隔。数据类型为整数型。允许接收空参数数据,1000毫秒 = 1秒 留空为无限等待。
第二个参数:延时单位。数据类型为整数型。允许接收空参数数据,默认为毫秒 0=毫秒 1=秒 2=分钟 3=小时。

在自己创建的线程中使用延时程序_延时实际上是一个样的,因为自己创建的线程上面是没有任何窗口和控件的,即使挂起也不会卡界面的,毕竟不是窗口线程。

如果在窗口线程下面还是使用程序_延时最好了。

注:延时命令会占用cpu,因为延时内部相当于是循环的去占用cpu来达到延时的一个目的,这个命令是不推荐大家使用的,因为它会将当前的cpu占满,这时这个线程就无法执行其它的了。

点击一下使用使用延时命令的那个按钮后cpu就会马上占满,因为我这个是四核的,所以占了一个核即25%,因为线程只能在一个核中执行。