[远航笔记流水账]易大漠多线程初级教程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)寫(xiě)入到這個(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)度條操作完畢把日志寫(xiě)道編輯框里面被查看' 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)' 這里要寫(xiě)道日志編輯框里面跳出循環(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)' 這里要寫(xiě)道日志編輯框里面跳出循環(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寫(xiě)入到線程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)度條操作完畢把日志寫(xiě)道編輯框里面被查看.子程序 _按鈕_關(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
- 下一篇: 数据结构-树(上)