下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
易語言多線程的認識與注意事項-(淺談多線程奔潰)什么是多線程:每個正在系統(tǒng)上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負責多個線程的調(diào)度和執(zhí)行。線程是程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,稱為多線程.線程和進程的區(qū)別在于,子進程和父進程有不同的代碼和數(shù)據(jù)空間,而多個線程則共享數(shù)據(jù)空間,每個線程有自己的執(zhí)行堆棧和程序計數(shù)器為其執(zhí)行上下文.多線程主要是為了節(jié)約CPU時間,發(fā)揮利用,根據(jù)具體情況而定.線程的運行中需要使用計算機的內(nèi)存資源和CPU。關(guān)于多線程基本認識:1、 關(guān)閉線程句柄對線程的運行不會有影響,關(guān)閉句柄并不代表結(jié)束線程;2、 線程句柄是用于對線程掛起、恢復(fù)、結(jié)束等操作,線程創(chuàng)建后,都會有一個線程句柄,如果不需要對線程句柄進行操作,建議立即關(guān)閉線程句柄;3、 線程句柄必須在適當?shù)臅r候關(guān)閉,否則會造成句柄泄露,但不同于內(nèi)存泄露。該泄露無前兆特征并且極大可能造成程序崩潰注意事項:1、 雖然啟動線程要比啟動進程要快,但是啟動線程仍是比較耗時的,因此,不要頻繁的啟動、退出線程,而是啟動線程后將各種任務(wù)處理完成后才退出(這種和線程池差不多);2、 對窗口各種組件操作,最好是在創(chuàng)建該窗口的線程上進行操作,如果在其它線程上操作,可能會引起程序出錯等情況(該錯誤是隨機出現(xiàn)的)。(未找到直接又安全的調(diào)用其他線程創(chuàng)建的組件的方法,有知道的人,麻煩告訴一下,謝謝?。?、 線程運行次序并不是按照我們創(chuàng)建他們時的順序來運行的,CPU處理線程的順序也是不確定的。4、 讀/寫共享資源時一般需要使用許可區(qū),當然,在明知成寫共享資源不會出現(xiàn)錯誤時,就不需要許可區(qū),這樣可提高性能。5、 在編寫多線程時,必須以多線程的方式考慮讀/寫共享資源,以避免出錯,不然的話,可能會出現(xiàn)各種問題,如:意外退出、同時多核CPU中由于處理線程的。6、 線程中如果需要使用COM對象時,要需將COM對象初始化,比如大漠插件,填表等都基于COM對象7、 結(jié)束線程時,應(yīng)該使用正常的控制代碼使線程退出,強烈反對使用強制結(jié)束線程()該命令極可能造成一些資源未釋放,從而導致程序的不穩(wěn)定?;诰€程的生命周期,線程代碼最好能讓其線程代碼自動執(zhí)行完畢自動退出線程,這樣是最穩(wěn)妥的處理方式.8、線程不能頻繁的發(fā)消息給窗口,頻繁的發(fā)消息給窗口,可能會造成窗口響應(yīng)其他事件的緩慢,也是就讓人感覺程序運行很慢;三?多線程的誤區(qū):1、 使用處理事件()。非窗口的線程是沒有窗口消息循環(huán),而處理事件()命令是用于消息循環(huán),因此在非窗口的線程上是不必加入“處理事件()”命令;2、 線程越多越好。線程并非越多越好,有些人將單線程改成多線程后,發(fā)現(xiàn)程序能處理更多的任務(wù)了,實際上這種方法是建立別的程序的痛苦之上(當然系統(tǒng)有空閑資源就并當別論了),別的程序可能因此而變慢。并且,線程數(shù)過多,會使CPU在線程間切換的開銷增加,因而使速度變慢.3、 多線程下頻繁操作線程,如強制關(guān)閉,掛起線程,等待線程等,在頻繁操作下有線程的阻塞有可能造成程序不穩(wěn)定或者奔潰,在易語言當中線程是極其脆弱的.并且當線程處于高速的循環(huán)代碼中強制結(jié)束線程極大可能會造成程序不穩(wěn)定或者直接內(nèi)存溢出奔潰或者某些資源無法釋放,當有資源無法釋放程序的流暢性以及穩(wěn)定性將大打折扣.4、 多線程對于全局變量/程序集變量等公共變量的操作中,一個賦值,其他只讀取是不會有問題的,這個問題是否定的,在某些變量類型中會出現(xiàn)"踩空"的現(xiàn)象,導致內(nèi)存訪問錯誤.此類編寫方式一般建議將功用變量聲明為整數(shù)型.四、許可區(qū)1、 許可區(qū)(一般稱為臨界區(qū)),不論是硬件許可資源,還是軟件許可資源,多個線程必須互斥地對它進行訪問,每個線程中訪問許可資源的那段代碼稱為許可區(qū)。2、 注意事項:、如果有若干線程要求進入許可區(qū),一次僅允許一個線程進入;、任何時候,處于許可區(qū)內(nèi)的線程不可多于一個。如已有線程進入自己的許可區(qū),則其它所有試圖進入許可區(qū)的線程將被掛起,并一直持續(xù)到進入許可區(qū)的線程退出;、進入一個空閑的許可區(qū)時,耗時極少,但是進入一個需等待的許可區(qū)時,耗時相對較長,因此需要避免經(jīng)常出現(xiàn)進入需等待的許可區(qū);、創(chuàng)建后許可區(qū),在不再使用時,需要將其刪除;、在使用許可區(qū)時,應(yīng)盡量減少許可區(qū)內(nèi)代碼,避免使用需長時間處理的代碼,使進入許可區(qū)的線程能盡快退出,以便其它線程能進入許可區(qū);、避免將整個線程處于許可區(qū)內(nèi),盡管它不會出錯,但是由于后來要求進入許可區(qū)的線程全部會被掛起,也就會出現(xiàn)雖然是多線程,但實際是以單線程方式執(zhí)行;、訪問相同的許可資源時,必須是以相同的許可區(qū)進入訪問,以不同的許可區(qū)進入訪問將可能會使許可區(qū)變的無意義(我在這個坑里蹲了很久,郁悶啊!)。3、 許可區(qū)缺點①、無法偵測某個許可區(qū)是否可進入,如果非要進行記錄,一般建議使用整數(shù)型變量進行賦值記錄,但是太方式會增大程序資源用.線程同步許可區(qū)在線程間進行同步是運用得最多的,這種速度最快,但只能用于本進程的線程同步;線程通信線程通信是一般都是需要配合線程同步來使用:1、 使用全局變量進行通信,推薦使用這種方法,目前是最快、最方便的通信方式;2、 使用消息通信(需要有消息隊列才能使用);3、基于許可區(qū)的變量通訊,也就是我們之前的類似線程同步方式;五、易語言多線程的注意點:.各種內(nèi)存錯誤線程a對變量操作的時候b也操作,a改寫了文本申請了新的內(nèi)存地址同時修改了指針然后釋放了原指針,但是b讀取了原指針需要讀取數(shù)據(jù)的時候,a已經(jīng)把指針釋放了.然后就各種內(nèi)存錯誤。。值得注意的是,一邊讀一邊執(zhí)行寫操作也不行,你線程a對全局文本變量賦值"1234567",那么在線程b對全局變量讀寫前,會經(jīng)過至少兩個步驟1、 獲取內(nèi)存區(qū)域大小,假設(shè)是8的話2、 讀取內(nèi)容而實際上進行到讀取第8位的時候,你線程a重新給全局文本變量賦值“123456”,這就導致“踏空”,于是程序直接崩潰。而對于長度固定的變量進行讀寫時,就算讀取到的數(shù)據(jù)是錯誤的,也不至于崩潰,比如固定位數(shù)的整數(shù)型變量..關(guān)于易語言控件操作問題。??丶僮饕欢ㄒ釉S可證。。這個大家都知道。。但這樣依然不會很穩(wěn)定。。一般建議不要頻繁對控件過多的進行操作,比如易語言的超級列表框..易語言啟動線程,結(jié)束線程問題啟動我建議用官方的多線程支持庫。?;蛘呤褂靡纵o客棧的線程—啟動()命令結(jié)束線程我強烈反對強制結(jié)束線程,無論是什么支持庫,什么多線程模塊,基本都是調(diào)用TerminateThread,應(yīng)該盡量避免這樣結(jié)束線程,能自動退出線程是最好不過的了.有些人喜歡在程序執(zhí)行的過程中喜歡退出線程或者也叫終止線程,該函數(shù)基本都是調(diào)用ExitThread來將線程終止的,該函數(shù)將終止線程的運行,并導致操作系統(tǒng)清除該線程使用的所有操作系統(tǒng)資源。但是有一些資源將不被撤消。這也有可能造成程序的不穩(wěn)定,時間久了有可能會導致程序自動關(guān)閉/奔潰等.關(guān)于句柄問題,不需要一定要CloseHandle,防止句柄泄露,一般如果不需要對該線程進行操作的,創(chuàng)建線程都不提供句柄參數(shù),讓系統(tǒng)自動銷毀,或者在操作完第一時間關(guān)閉句柄.易語言常見的線程奇葩問題某些易自身問題,因為這很大程度是易本身的問題,并且無法處理,我們只能選擇盡量避免.多數(shù)已在新版本易中修復(fù).易語言本身的命令問題易語言本身的分割文本命令、讀寫配置項()命令、這些命令在多線程中會出問題在易語言業(yè)界中已經(jīng)不是秘密了!很多人喜歡在線程中不斷地保存或者讀取配置信息,這個做法是不可取的,隨時有可能再某個時間奔潰或者在較長一段時間后出現(xiàn)錯誤.在必要斷讀取的條件下,可以嘗試文本文件的方式,只能說比讀寫配置會好點,具體穩(wěn)定性請自行測試..易語言本身的延時,延遲在線程中如果非要使用,盡量選擇延時命令,也可與在延時后加處理事件,盡量避免用延遲,請使用[易輔客棧模塊]中的輔助延時()命令六、大漠多線程:1.1個線程必須擁有一個大漠對象,每個線程對象在操作使用完畢后必須銷毀對象部分窗口在使用大漠UnBindWindow函數(shù)進行解綁時,可能會有殘留也就是無法完全解綁.在此情況下,重復(fù)綁定可能會造成程序或者窗口奔潰,解決辦法是使用ForceUnBindWin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年環(huán)境監(jiān)測技術(shù)員考試題庫污染治理試題及解答
- 2026年初級電工材料及電路分析模擬題
- 2026年建筑工程質(zhì)量檢測員技能考核題
- 2026年網(wǎng)絡(luò)安全專業(yè)筆試模擬題集
- 2026年企業(yè)生產(chǎn)車間安全B證考試要點從安全文化建設(shè)開始
- 2026年旅游文化與地理知識競賽題目
- 道路交通流暢性提升方案
- 精裝修標準制定與實施方案
- 道路路基加固技術(shù)方案
- 城中村環(huán)境治理技術(shù)方案
- 鋼架樓梯合同(標準版)
- 管道區(qū)段長管理辦法
- 2025年江西公務(wù)員考試(財經(jīng)管理)測試題及答案
- CRT-YS4690消防控制室圖形顯示裝置使用說明書-營口賽福德
- 植筋工程施工驗收記錄表范例
- 2025至2030年中國冷凍食品行業(yè)市場調(diào)研及行業(yè)投資策略研究報告
- 壓空罐安全知識培訓課件
- 2025年江蘇南京市建鄴區(qū)招聘第一批購崗人員5人筆試模擬試題及答案詳解1套
- 市場保潔管理方案(3篇)
- 醫(yī)院調(diào)料雜糧副食品采購項目方案投標文件(技術(shù)方案)
- 靜脈給藥的安全管理
評論
0/150
提交評論