(五)用bcb編寫多執行緒應用程式
隨著windows系統的全球性普及,多執行緒技術已越來越多地運用到許多軟體設計中。使用多執行緒技術可全面提高應用程式的執行效率。以前為了實現多執行緒程式設計,基本上都是呼叫一系列的api函式,如createthread、resumethread等,不容易控制,還容易出錯。在使用bcb以後,我才發現原來編寫多執行緒程式也可以如此簡單!bcb為我們提供了強大的tthread類,從而使得多執行緒程式設計變得非常簡便易用。下面請跟我一起開始我們的bcb多執行緒程式設計之旅。
1. 建立多執行緒程式:
首先,我介紹一下bcb中編寫多執行緒程式的具體步驟。
在c++builder ide環境下選擇選單filenew,在new欄中選中thread object,按ok,接下來彈出輸入框,輸入tthread物件子類的名字newthread,這樣c++builder自動為你建立了乙個名為tnewthread的tthread子類。下面是tnewthread的部分原始碼:
__fastcall newthread::mythread(bool createsuspended)
: tthread(createsuspended)
void __fastcall newthread::execute()
通過以上步驟我們基本實現了在程式中如何建立乙個執行緒,並使程式實現了多執行緒應用。但是,多執行緒應用的實現,並不是一件簡單的工作,還需要考慮很多使多個執行緒能在系統中共存、互不影響的因素。比如,程式中公共變數的訪問、資源的分配,如果處理不當,不僅執行緒會死鎖陷入混亂,甚至可能會造成系統崩潰。總的來講,在多執行緒程式設計中要注意共享物件和資料的處理,不能忽視。因此,下面我們要講的就是多執行緒中常見問題:
2. 多執行緒中vcl物件的使用
void __fastcall tnewthread::pushthebutton(void)
void __fastcall tnewthread::execute()
對button1-〉click()方法的呼叫就是通過synchronize()方法來實現的,它可以自動避免發生多執行緒訪問衝突。在c++builder中,雖然有一些vcl物件也是執行緒訪問安全的(如tfont、tpen、tbrush等),可以不用sychronize()方法對它們的屬性方法進行訪問呼叫以提高程式效能,但是,對於更多的無法確定的vcl物件,還是強烈建議使用synchronize()方法確保程式的可靠性。
c++ builder 高手高階(五)用bcb編寫多執行緒應用程式(2) 3. 多執行緒中公共資料的使用
程式設計中難免要在多個執行緒中共享資料或者物件。為了避免在多執行緒中因為同時訪問了公共資料塊而造成災難性的後果,我們需要對公共資料塊進行保護,直到乙個執行緒對它的訪問結束為止。這可以通過臨界區域(critical section)的使用來實現,所幸的是在c++builder中,給我們提供了乙個tcriticalsection物件來進行臨界區域的劃定。該物件有兩個方法,acquire()和release()。它設定的臨界區域可以保證一次只有乙個執行緒對該區域進行訪問。如下例所示:
class tnewthread : public tthread ;
void __fastcall tnewthread::execute()
這樣,對公共變數x,y的訪問就通過全域性tcriticalsection 物件保護起來,避免了多個執行緒同時訪問的衝突。
4. 多執行緒間的同步
作業系統
,系統核心為我們提供了事件(event)、mutex、訊號燈(semaphore)和計時器4種物件來控制線程間的同步。在c++builder中,為我們提供了用於建立event的tevent 物件供我們使用。
當程式中乙個執行緒的執行要等待一項特定的操作的完成而不是等待乙個特定的執行緒完成時,我們就可以很方便地用tevent物件來實現這個目標。首先建立乙個全域性的tevent物件作為所有執行緒可監測的標誌。當乙個執行緒完成某項特定的操作時,呼叫tevent物件的setevent()方法,這樣將設定這個標誌,其他的執行緒可以通過監測這個標誌獲知操作的完成。相反,要取消這個標誌,可以呼叫resetevent()方法。在需要等待操作完成的執行緒中使用waitfor()方法,將一直等待這個標誌被設定為止。注意waitfor()方法的引數是等待標誌設定的時間,一般用infinite表示無限等待事件的發生,如果其它執行緒執行有誤,很容易使這個執行緒死住(等待乙個永不發生的事件)。
其實直接用windows api函式也可以很方便地實現事件(event)、訊號(semaphore)控制技術。尤其是c++builder,在呼叫windows api方面有著其它語言無可比擬的優勢。所用的函式主要有:createsemaphore()、createevent()、waitforsingleobject()、releasesemaphore()、setevent()等等。
< td>
Android高手高階教程
android高手高階教程 android高手高階教程 一 之 android常用名令集錦 並茂 android高手高階教程 二 之 android launcher抽屜類slidingdrawer的使用 android高手高階教程 三 之 android 中自定義view的應用 android高手...
攻防世界 MISC 高手高階
連著提取幾個壓縮包後,得到兩個,可能是盲水印或者合成,嘗試了一下合成直接得到flag flag azadi tower 題目是乙個,上面有md5但是有一段看不清,formost分離出乙個壓縮包,但是需要密碼,回頭看看題目說要署名,想到掩碼攻擊,但是總共有幾位呢,看到不少於1000字,1000是二進位...
攻防世界(MISC)高手高階
拿到放入kali,用zsteg檢視得到flag zsteg真的很強大,大部分隱寫都能解決 zsteg安裝 git clone cd zsteg gem install zsteg 開啟放入stegsolve裡面檢視發現flag 得到了flag結合題目,倒立一下 9102 ccsi 這題不得不說腦洞挺...