多线程入门1

admin2020-12-08  388

背景


当你点击EXE文件系统一个应用程序的时候 - 系统会创建一个进程(process)
而在一个进程内可以包含多个线程(thread)。用来显示界面的线程,我们通常称为“界面线程”,
其他不是用来显示界面的线程,我们一般称为“工作线程”或者是“后台线程”。

界面线程会使用 win.loopMessage(); 启动一个消息循环,
win.loopMessage(); 就象一个快递公司不知疲倦的收发消息,直到用户关闭最后一个窗口他才会退出。
当然你也可以使用 win.quitMessage() 退出消息循环。

下面是一个启动界面线程的例子:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
    button={cls="button";text="耗时操作"; ...}
)
/*}}*/

//用户点击窗口上的按钮时会触发下面的回调函数
winform.button.oncommand = function(id,event){   
    //下面用sleep函数休眠5秒(5000毫秒)模拟耗时操作
    sleep(5000)
}

winform.show();
win.loopMessage();

 

你可以看到一个窗体显示在屏幕上,如果你去掉代码中的最后一句 win.loopMessage();那么窗体只会显示一下就消失了,你的程序也迅速退出了。

但如果你加上 win.loopMessage(); 窗体就会一直显示在屏幕上(直到你点击关闭按钮)。
并且你可以做其他的操作,例如点击按钮。

我们尝试点击按钮,点击按钮后触发了 winform.button.oncommand() 函数,
一件让我们困惑的事发生了,窗体卡死了任何操作都没有反应,这是因为类似 sleep(5000) 这样的耗时操作阻塞了win.loopMessage()启动的消息循环过程。

一种解决方法是把 sleep(5000)改成 win.delay(5000),虽然他们同样都是延时函数,但是win.delay()会同时继续处理窗口消息。但如果我们不只是延时还要做其他耗时的操作,那就需要启动一个新的线程。

转载请注明原文地址: https://seopai.com/read-31.html

最新回复(0)