[远航笔记流水账]易大漠多线程初级教程086(1-3)
1.易大漠多線程初級(jí)之多線程介紹
什么是多線程 沒(méi)什么可說(shuō)的
單線程:
多線程:
2.易大漠多線程初級(jí)之函數(shù)命令介紹
多線程的4個(gè)基礎(chǔ)函數(shù):
注意:
1.如果掛起失敗 和恢復(fù)失敗 函數(shù)會(huì)返回-1? 如果成功 那么返回值肯定大于-1? 用這個(gè)判斷是否掛起成功
2.要關(guān)閉線程 必須是要線程_強(qiáng)制關(guān)閉()和線程_關(guān)閉句柄()2個(gè)函數(shù)才可以? 線程_強(qiáng)制關(guān)閉() 是負(fù)責(zé)關(guān)閉線程 而 線程_關(guān)閉句柄() 負(fù)責(zé)把線程id這個(gè)控制線程的入口給徹底注銷? 我們以后再用這個(gè)線程id來(lái)控制線程都是無(wú)效的 雖然線程id內(nèi)的值并沒(méi)有變化
3 線程id最好是程序集 方便 其他線程操作函數(shù)的調(diào)用
4 用線程_啟動(dòng)腳本() 線程_掛起腳本() 線程_恢復(fù)腳本() 這是遠(yuǎn)航老師封裝的 也是它推薦使用的? 我們就不用精益模塊的線程函數(shù) 用這幾個(gè)來(lái)操作線程
5 暫時(shí)沒(méi)遇到線程啟動(dòng) 線程強(qiáng)制關(guān)閉 線程關(guān)閉句柄失敗的情況 就不考慮這個(gè)情況了 注意這3個(gè)函數(shù)返回為假 表示操作失敗
小問(wèn)題:如果沒(méi)有線程 那么腳本執(zhí)行期間我們無(wú)法操作界面 界面陷入假死
如果循環(huán)沒(méi)有任何延遲 運(yùn)行這循環(huán) 那么界面就陷入假死 無(wú)法進(jìn)行任何操作
建議:任何循環(huán)或多或少都要加入一點(diǎn)點(diǎn)延遲
避免這個(gè)情況的發(fā)聲
小問(wèn)題:有的時(shí)候 線程掛起會(huì)失敗 例子里面是因?yàn)榫€程里面循環(huán)間隔沒(méi)有 運(yùn)行太快 導(dǎo)致的
解決辦法:再循環(huán)內(nèi)加入適當(dāng)?shù)难舆t 同上面的問(wèn)題
隨便看看:老師的3個(gè)線程函數(shù)和精益模塊的對(duì)應(yīng)函數(shù)的區(qū)別
遠(yuǎn)航老師這里似乎是考慮到萬(wàn)一啟動(dòng)線程的線程id為空? 會(huì)清理下資源? 不是很清楚干什么用
遠(yuǎn)航精益模塊
結(jié)論:仔細(xì)看了一下? 線程啟動(dòng)的函數(shù) 精益模塊和遠(yuǎn)航老師有區(qū)別 區(qū)別就是遠(yuǎn)航的啟動(dòng)會(huì)考慮到玩意返回的線程id為空 會(huì)自動(dòng)把線程id對(duì)應(yīng)的線程資源關(guān)閉掉 而精益模塊沒(méi)有這個(gè)方面的應(yīng)對(duì)
至于掛起和恢復(fù)函數(shù) 遠(yuǎn)航和精益模塊一樣 沒(méi)有區(qū)別
3.1易大漠多線程初級(jí)之許可證(線程鎖)應(yīng)用
許可證(或者叫線程鎖)作用:多個(gè)線程同時(shí)使用各種共有的資源? 比如全局變量 界面的各個(gè)組件總不能你搶我搶 需要指定一個(gè)規(guī)則? 比如說(shuō)對(duì)同一個(gè)叫intX intY的全局變量 主要是負(fù)責(zé)記錄找圖后的返回坐標(biāo)值? 如果沒(méi)有規(guī)則可能出現(xiàn)同一時(shí)間 多個(gè)線程中的找題同時(shí)把找到的坐標(biāo)寫入到這個(gè)全局變量中? 那么當(dāng)我們要點(diǎn)擊intX intY 里面的坐標(biāo) 那么這個(gè)坐標(biāo)是屬于哪個(gè)線程里面的找圖找到的坐標(biāo)呢 會(huì)造成混亂? 所以需要許可證(線程鎖)規(guī)定誰(shuí)先誰(shuí)后 ,比如線程1來(lái)了 它把許可證放在全局變量門前 表明這個(gè)全局變量 我線程1在用 其他線程來(lái)了看到這個(gè)線程1的許可證就明白了? 就在門口等? 線程1使用完了全局變量后 把門口的許可證拿走了 后面的線程看到了 就紛紛把自己的許可證放到門口 爭(zhēng)取使用權(quán)
個(gè)人感覺(jué) 許可證不能適用于大片代碼 因?yàn)樵S可證制度是一定時(shí)間內(nèi)獨(dú)占 某個(gè)公共資源 其他線程都要等著 所以只在線程要使用某個(gè)公共資源的時(shí)候用一下
常見(jiàn)的公共資源:
1.全局變量
2.程序集變量
3界面的組件。
因?yàn)槔蠋熢S可證實(shí)例這部分沒(méi)有錄制完整?
許可證的使用注意的幾點(diǎn)
1.許可證本身也是全局變量
2.每個(gè)線程對(duì)應(yīng)一個(gè)屬于它的許可證
3 定義了線程的許可證 要操作公共資源 要用進(jìn)入和離開(kāi)
4 線程結(jié)束 請(qǐng)不要忘記刪除許可證
5 許可證不是萬(wàn)能的 在操作界面的某些組件 許可證可能也會(huì)崩潰
3.2易大漠多線程初級(jí)之許可證(線程鎖)應(yīng)用2
小知識(shí):對(duì)于輔助延時(shí)()函數(shù)的理解
平時(shí)看多線程的源碼 純易語(yǔ)言的多線程源碼? 他們的基本結(jié)構(gòu)
使用了延時(shí)()和 處理事件()配合 讓循環(huán)不會(huì)導(dǎo)致界面陷入假死卡住狀態(tài),遠(yuǎn)航用的是 輔助延時(shí)() 看了下這個(gè)函數(shù)的源碼
里面已經(jīng)包含了 處理事件和延時(shí)
小知識(shí):兩套許可證操作函數(shù)的選擇
易語(yǔ)言本身存在一套操作許可證的函數(shù) 參數(shù)統(tǒng)一要求的是整數(shù)型
.版本 2
.支持庫(kù) EThread
??? 創(chuàng)建進(jìn)入許可證 ()
???? 進(jìn)入許可區(qū) ()
???? 退出許可區(qū) ()
???? 刪除進(jìn)入許可證 ()
而遠(yuǎn)航 或者說(shuō)精益模塊里面的另外一套操作許可證的函數(shù) 要求參數(shù)必須是許可證類型(推薦)
.版本 2
??? 線程_創(chuàng)建許可證 ()
???? 線程_刪除許可證 ()
???? 線程_進(jìn)入許可區(qū) ()
???? 線程_退出許可區(qū) ()
偶得:自己練手做個(gè)簡(jiǎn)單的多線程控制 8個(gè)進(jìn)度條的代碼(做個(gè)紀(jì)念)
界面
.版本 2.程序集 窗口程序集_啟動(dòng)窗口 .程序集變量 許可證集合, 線程許可證, , "0" .程序集變量 線程id, 整數(shù)型, , "0" .程序集變量 進(jìn)度條任務(wù), 整數(shù)型, , "0".子程序 __啟動(dòng)窗口_創(chuàng)建完畢' 1. 重置進(jìn)度條的位置歸零 _啟動(dòng)窗口.進(jìn)度條1.位置 = 0 _啟動(dòng)窗口.進(jìn)度條2.位置 = 0 _啟動(dòng)窗口.進(jìn)度條3.位置 = 0 _啟動(dòng)窗口.進(jìn)度條4.位置 = 0 _啟動(dòng)窗口.進(jìn)度條5.位置 = 0 _啟動(dòng)窗口.進(jìn)度條6.位置 = 0 _啟動(dòng)窗口.進(jìn)度條7.位置 = 0 _啟動(dòng)窗口.進(jìn)度條8.位置 = 0' 2.讓停止按鈕為灰色 開(kāi)啟按鈕正常 _啟動(dòng)窗口.按鈕_開(kāi)啟.禁止 = 假 _啟動(dòng)窗口.按鈕_關(guān)閉.禁止 = 真 ' 3. 清空編輯框的內(nèi)容 _啟動(dòng)窗口.編輯框_日志.內(nèi)容 = “”.子程序 線程_測(cè)試函數(shù), , 公開(kāi) .參數(shù) 當(dāng)前線程標(biāo)識(shí)id, 整數(shù)型 .局部變量 進(jìn)度條任務(wù)標(biāo)識(shí), 整數(shù)型 .局部變量 i, 整數(shù)型' 4 線程內(nèi) 先從進(jìn)度條任務(wù)數(shù)組 取到對(duì)應(yīng)的進(jìn)度條標(biāo)識(shí) 然后開(kāi)始完成進(jìn)度條操作 該進(jìn)度條操作完畢把日志寫道編輯框里面被查看' 3 完成上一個(gè)進(jìn)度條操作 繼續(xù)找下一個(gè)進(jìn)度條 .判斷循環(huán)首 (真)' 1 從進(jìn)度條任務(wù)數(shù)組獲取要執(zhí)行的進(jìn)度條標(biāo)識(shí) 如果數(shù)組為空了則直接結(jié)束線程 結(jié)束前給日志編輯框發(fā)送信息' 進(jìn)入許可區(qū) (許可證集合 [當(dāng)前線程標(biāo)識(shí)id])線程_進(jìn)入許可區(qū) (許可證集合 [當(dāng)前線程標(biāo)識(shí)id]).如果 (取數(shù)組成員數(shù) (進(jìn)度條任務(wù)) < 1)' 這里要寫道日志編輯框里面跳出循環(huán) ().否則' 取出數(shù)組第一個(gè)元素進(jìn)度條任務(wù)標(biāo)識(shí) = 進(jìn)度條任務(wù) [1]刪除成員 (進(jìn)度條任務(wù), 1, ).如果結(jié)束線程_退出許可區(qū) (許可證集合 [當(dāng)前線程標(biāo)識(shí)id])' 2 更具進(jìn)度條標(biāo)識(shí)來(lái)控制進(jìn)度條進(jìn)度不斷增加直到500結(jié)束.判斷開(kāi)始 (進(jìn)度條任務(wù)標(biāo)識(shí) = 1)i = _啟動(dòng)窗口.進(jìn)度條1.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條1.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 2)i = _啟動(dòng)窗口.進(jìn)度條2.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條2.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 3)i = _啟動(dòng)窗口.進(jìn)度條3.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條3.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 4)i = _啟動(dòng)窗口.進(jìn)度條4.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條4.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 5)i = _啟動(dòng)窗口.進(jìn)度條5.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條5.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 6)i = _啟動(dòng)窗口.進(jìn)度條6.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條6.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 7)i = _啟動(dòng)窗口.進(jìn)度條7.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條7.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().判斷 (進(jìn)度條任務(wù)標(biāo)識(shí) = 8)i = _啟動(dòng)窗口.進(jìn)度條8.位置.判斷循環(huán)首 (i ≤ 500)i = i + 2_啟動(dòng)窗口.進(jìn)度條8.位置 = i輔助延時(shí) (50).判斷循環(huán)尾 ().默認(rèn)' 這里要寫道日志編輯框里面跳出循環(huán) ().判斷結(jié)束.判斷循環(huán)尾 ().子程序 _按鈕_開(kāi)啟_被單擊 .局部變量 i, 整數(shù)型 .局部變量 局_線程id, 整數(shù)型 .局部變量 結(jié)果, 邏輯型' 0 按鈕狀態(tài)調(diào)整一下 _啟動(dòng)窗口.按鈕_開(kāi)啟.禁止 = 真 _啟動(dòng)窗口.按鈕_關(guān)閉.禁止 = 假' 1.根據(jù)界面上的線程數(shù)量 開(kāi)始生成對(duì)應(yīng)的許可證 清除數(shù)組 (許可證集合) .計(jì)次循環(huán)首 (到整數(shù) (_啟動(dòng)窗口.編輯框_線程數(shù).內(nèi)容), )加入成員 (許可證集合, 線程_創(chuàng)建許可證 ())輔助延時(shí) (200) .計(jì)次循環(huán)尾 () ' 2.生成一個(gè)進(jìn)度條任務(wù)數(shù)組 每完成一個(gè)進(jìn)度條 就把該進(jìn)度條在數(shù)組對(duì)應(yīng)的元素刪除掉 清除數(shù)組 (進(jìn)度條任務(wù)) .計(jì)次循環(huán)首 (8, i)加入成員 (進(jìn)度條任務(wù), i).計(jì)次循環(huán)尾 () ' 3 開(kāi)始生成線程 并把線程對(duì)應(yīng)的線程id寫入到線程id數(shù)組 等待備用 清除數(shù)組 (線程id) .計(jì)次循環(huán)首 (到整數(shù) (_啟動(dòng)窗口.編輯框_線程數(shù).內(nèi)容), i)結(jié)果 = 線程_啟動(dòng)腳本 (&線程_測(cè)試函數(shù), i, 局_線程id).如果真 (結(jié)果)加入成員 (線程id, 局_線程id).如果真結(jié)束輔助延時(shí) (2000) .計(jì)次循環(huán)尾 ()' 4 線程內(nèi) 先從進(jìn)度條任務(wù)數(shù)組 取到對(duì)應(yīng)的進(jìn)度條標(biāo)識(shí) 然后開(kāi)始完成進(jìn)度條操作 該進(jìn)度條操作完畢把日志寫道編輯框里面被查看.子程序 _按鈕_關(guān)閉_被單擊 .局部變量 i, 整數(shù)型' 改變下按鈕狀態(tài) _啟動(dòng)窗口.按鈕_開(kāi)啟.禁止 = 假 _啟動(dòng)窗口.按鈕_關(guān)閉.禁止 = 真' 清理線程 .計(jì)次循環(huán)首 (取數(shù)組成員數(shù) (線程id), i)' 線程id線程_強(qiáng)制結(jié)束 (線程id [i])線程_關(guān)閉句柄 (線程id [i])輔助延時(shí) (200) .計(jì)次循環(huán)尾 ()' 刪除許可證 .計(jì)次循環(huán)首 (取數(shù)組成員數(shù) (許可證集合), i)' 加入成員 (許可證集合, 線程_創(chuàng)建許可證 ())線程_刪除許可證 (許可證集合 [i])輔助延時(shí) (200) .計(jì)次循環(huán)尾 ().子程序 __啟動(dòng)窗口_將被銷毀 .局部變量 i, 整數(shù)型' 清理線程 .計(jì)次循環(huán)首 (取數(shù)組成員數(shù) (線程id), i)' 線程id線程_強(qiáng)制結(jié)束 (線程id [i])線程_關(guān)閉句柄 (線程id [i])輔助延時(shí) (200) .計(jì)次循環(huán)尾 () ' 刪除許可證 .計(jì)次循環(huán)首 (取數(shù)組成員數(shù) (許可證集合), i)' 加入成員 (許可證集合, 線程_創(chuàng)建許可證 ())線程_刪除許可證 (許可證集合 [i])輔助延時(shí) (200) .計(jì)次循環(huán)尾 ().子程序 _按鈕_重置_被單擊.如果真 (_啟動(dòng)窗口.按鈕_開(kāi)啟.禁止 = 假)' 1. 重置進(jìn)度條的位置歸零_啟動(dòng)窗口.進(jìn)度條1.位置 = 0_啟動(dòng)窗口.進(jìn)度條2.位置 = 0_啟動(dòng)窗口.進(jìn)度條3.位置 = 0_啟動(dòng)窗口.進(jìn)度條4.位置 = 0_啟動(dòng)窗口.進(jìn)度條5.位置 = 0_啟動(dòng)窗口.進(jìn)度條6.位置 = 0_啟動(dòng)窗口.進(jìn)度條7.位置 = 0_啟動(dòng)窗口.進(jìn)度條8.位置 = 0' 2.讓停止按鈕為灰色 開(kāi)啟按鈕正常_啟動(dòng)窗口.按鈕_開(kāi)啟.禁止 = 假_啟動(dòng)窗口.按鈕_關(guān)閉.禁止 = 真' 3. 清空編輯框的內(nèi)容_啟動(dòng)窗口.編輯框_日志.內(nèi)容 = “”.如果真結(jié)束轉(zhuǎn)載于:https://www.cnblogs.com/zjl8455482/p/10452650.html
總結(jié)
以上是生活随笔為你收集整理的[远航笔记流水账]易大漠多线程初级教程086(1-3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html5该怎么样学习?零基础入门HTM
- 下一篇: 数据结构-树(上)