線程可以分為界麵線程、工作線程。界麵線程簡單的你可以理解包含 winform.show(); win.loopMessage(); 這種創建窗口,顯示用戶界面的線程,反之則稱為工作線程。界麵線程通常都會有 win.loopMessage() 這麼一句代碼用於啟動界麵線程的消息循環,這個 win.loopMessage() 就像人的心跳一樣 - 他一停止界麵線程也就玩完了。
注意界麵線程本身是一個獨立的線程,不要在工作線程中去直接操作界麵線程中的窗口對象這些,
而且在所有線程中你都不要直接去操作另一個線程的對象,你需要瞭解一些最基本的線程間打交道的規則。
打個比方:多線程就像多個在並列的軌道上疾馳的火車,
你要在A火車上與B火車上的人交互,或者你想讓B火車上的人幹什麼,你要注意以下四個規則:
1、你不能直接無保護的操作其他線程中的對象,這相當於在火車飛馳的時候,你冒著被撕碎的危險伸手到另一部火車上去操作點什麼,aardio中你不能進行如此愚蠢的行為,這是被禁止的,你沒辦法做到這一點。
2、任何多線程需要用到的公共代碼,都需要放到庫模塊裡,並且可以使用 import 導入線程,在一個線程中import的庫模塊不等於在另一個線程中你就不用再 import,這就好像給火車加油,油箱是公用的,但是哪個火車需要油需要自己去import,你給A火車加油不等於B火車就不用加油了。
3、你可以在創建線程的時候給另外一個線程傳遞啟動參數,這相當於在火車還沒有啟動以前,一部火車上的人給另一部火車上的人送點東西,這是安全的,用代碼來講就是這樣寫:
thread.invoke( 線程函數,"給你的","這也是給你的","如果還想要上車後打我電話" ) 4、在線程啟動以後,你需要通過 thread.command 發送命令給其他線程、或者響應其他線程的命令消息,這相當於你在一部火車上給另一部火車上的人打電話,讓他做點什麼操作(而不是從車窗中把你的手或頭伸到另一部火車上親自去操作),這用代碼來演示下就是這樣寫: import win.ui;
/*DSG{{*/
var winform = win.form(text="線程命令";right=599;bottom=399)
winform.add(
edit={cls="edit";left=12;top=11;right=588;bottom=389;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1}
)
/*}}*/
import thread.command;
var listener = thread.command();
listener.print = function( ... ){
winform.edit.print( ... ) //我們在界麵線程中這樣響應工作線程的消息
}
//創建工作線程
thread.invoke(
function(){
//必須在線程函數內部導入需要的庫
import thread.command;
//調用界麵線程的命令
thread.command.print("hello world",1,2,3);
}
)
winform.show();
win.loopMessage();
非常簡單是吧?你只要遵守多線程的基本交通規則,那麼你使用 aardio 寫多線程的代碼就會非常的快樂。你基本上很少會遇到很多線程的痛苦問題,這些痛苦的問題aardio都幫你解決好了。
當然,如果你的思維方式是:「我就是要在工作線程中直接操作界麵線程的 winform 什麼的」,那這麼就會很痛苦了 - 因為:「aardio就是不讓你這麼做!」,我曾經看到某人,他在界麵線程中創建了一個 web.form ,然後創建了很多的工作線程 - 再削尖腦殼的想辦法掛接上去操作 web.form,他以為這樣就聰明的繞過了aardio給他的限制,這樣會讓界麵線程跑的更快,其實這是讓界麵線程跑的更慢,而且讓界麵線程變的非常不穩定且容易崩潰。而且這傢伙用了好幾年的時間執著於研究這種技術,例如他修改一個界面上文本框的值,他不直接寫 winform.edit.text = "文本值",他會寫一大堆的代碼創建一個線程再 winex.find() 查找窗口,查找到窗口以後再通過句柄用寫模擬輔助的方式去修改一個文本框的值,實在是愚昧不可救藥!
讓多個線程去操作界麵線程的對象,這就相當於你把火車上的人都喊下車了,張三抱個輪子往前跑,李四跑個車廂往前跑,這並不能讓你這部火車跑的比其他火車更快,只會讓你這部火車變的混亂痛苦。
你不能這樣搞,一定要遵守秩序和規則,例如大家坐火車,不能你覺得到站了就從車窗往下跳,他覺得到站了就從車窗往下跳,這是不可以的,你必須先去登記,你要在A站下車,他要在B站下車,到站以後自覺排隊,輪到你了再排隊下車。上車也一樣,你不能看到火車來了就往上跳,你得先去買票登記,火車到站了以後,你再排隊上車。這個排隊上下車的機制在 aardio 裡就是 thread.command。
所以大家要理解第一原則:在 aardio 裡寫多線程代碼,首先就是要學會並且必須要學會運用 thread.command,不用 thread.command 去寫多線程代碼,就好比坐火車不買票 - 那是耍流氓!
|