亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

在C++Builer中多線程的實現(xiàn)

2019-09-06 23:33:44
字體:
供稿:網(wǎng)友

                    還在Dos時代,人們就在尋求一種多任務(wù)的實現(xiàn)。于是出現(xiàn)了TSR類型的后臺駐留程序,比較有代表性的有Side Kick、Vsafe等優(yōu)秀的TSR程序,這類程序的出現(xiàn)和應(yīng)用確實給用戶使用計算機帶來了極大的方便,比如Side Kick,我們編程可以在不用進(jìn)編輯程序的狀態(tài)下,一邊編輯源程序,一邊編譯運行,非常方便。但是,Dos單任務(wù)操作系統(tǒng)的致命缺陷注定了在Dos下不可能開發(fā)出真正的多任務(wù)程序。進(jìn)入Windows3.1時代,這種情況依然沒有根本的改變,一次應(yīng)用只能做一件事。比如數(shù)據(jù)庫查詢,除非應(yīng)用編得很好,在查詢期間整個系統(tǒng)將不響應(yīng)用戶的輸入。
  進(jìn)入了Windows NT和Windows 9x時代,情況就有了徹底的改觀,操作系統(tǒng)從真正意義上實現(xiàn)了多任務(wù)(嚴(yán)格地說,Win9x還算不上)。一個應(yīng)用程序,在需要的時候可以有許多個執(zhí)行線程,每個線程就是一個小的執(zhí)行程序,操作系統(tǒng)自動使各個線程共享CPU資源,確保任一線程都不能使系統(tǒng)死鎖。這樣,在編程的時候,可以把費時間的任務(wù)移到后臺,在前臺用另一個線程接受用戶的輸入。對那些對實時性要求比較高的編程任務(wù),如網(wǎng)絡(luò)客戶服務(wù)、串行通信等應(yīng)用時,多線程的實現(xiàn)無疑大大地增強了程序的可用性和穩(wěn)固性。
  在Windows NT和Windows 9x中,多線程的編程實現(xiàn)需要調(diào)用一系列的API函數(shù),如CreateThread、ResumeThread等,比較麻煩而且容易出錯。我們使用Inprise公司的新一代RAD開發(fā)工具C++Builder,可以方便地實現(xiàn)多線程的編程。與老牌RAD工具Visual Basic和Delphi比,C++Builer不僅功能非常強大,而且它的編程語言是C++,對于系統(tǒng)開發(fā)語言是C的Windows系列操作系統(tǒng),它具有其它編程語言無可比擬的優(yōu)勢。利用C++Builder提供的Tthread對象,多線程的編程變得非常簡便易用。那么,如何實現(xiàn)呢?且待我慢慢道來,讓你體會一下多線程的強大功能。
  1. 創(chuàng)建多線程程序:
  首先,先介紹一下實現(xiàn)多線程的具體步驟。在C++Builder中雖然用Tthread對象說明了線程的概念,但是Tthread對象本身并不完整,需要在Tthread下新建其子類,并重載Execute方法來使用線程對象。在C++Builder下可以很方便地實現(xiàn)這一點。
  在C++Builder IDE環(huán)境下選擇菜單File|New,在New欄中選中Thread Object,按OK,接下來彈出輸入框,輸入Tthread對象子類的名字MyThread,這樣C++Builder自動為你創(chuàng)建了一個名為TMyThread的Tthread子類。同時編輯器中多了一個名為Unit2.cpp的單元,這就是我們創(chuàng)建的TMyThread子類的原碼,如下:
  #include
 ?。ragma hdrstop
  
 ?。nclude “Unit2.h”
  #pragma package(smart_init)
  //---------------------
  // Important: Methods and properties of objects in VCL can only be
  // used in a method called using Synchronize, for example:
  //
  // Synchronize(UpdateCaption);
  //
  // where UpdateCaption could look like:
  //
  // void __fastcall MyThread::UpdateCaption()
  // {
  // Form1->Caption = “Updated in a thread”;
  // }
  //--------------------
  __fastcall MyThread::MyThread(bool CreateSuspended)
   : Tthread(CreateSuspended)
  {
  }
  //--------------------
  void __fastcall MyThread::Execute()
  {
   //---- Place thread code here ----
  }
  //---------------------
  其中的Execute()函數(shù)就是我們要在線程中實現(xiàn)的任務(wù)的代碼所在處。在原代碼中包含Unit2.cpp,這個由我們創(chuàng)建的TMyThread對象就可以使用了。使用時,動態(tài)創(chuàng)建一個TMyThread 對象,在構(gòu)造函數(shù)中使用Resume()方法,那么程序中就增加了一個新的我們自己定義的線程TMyThread,具體執(zhí)行的代碼就是Execute()方法重載的代碼。要加載更多的線程,沒關(guān)系,只要繼續(xù)創(chuàng)建需要數(shù)量的TMyThread 對象就成。
  以上我們初步地實現(xiàn)了在程序中創(chuàng)建一個自定義的線程,并使程序?qū)崿F(xiàn)了多線程應(yīng)用。但是,多線程應(yīng)用的實現(xiàn),并不是一件簡單的工作,還需要考慮很多使多個線程能在系統(tǒng)中共存、互不影響的因素。比如,程序中公共變量的訪問、資源的分配,如果處理不當(dāng),不僅線程會死鎖陷入混亂,甚至可能會造成系統(tǒng)崩潰。總的來講,在多線程編程中要注意共享對象和數(shù)據(jù)的處理,不能忽視。因此,下面我們要講的就是多線程中常見問題:
  2. 多線程中VCL對象的使用
  我們都知道,C++Builder編程是建立在VCL類庫的基礎(chǔ)上的。在程序中經(jīng)常需要訪問VCL對象的屬性和方法。不幸的是,VCL類庫并不保證其中對象的屬性和方法是線程訪問安全的(Thread_safe),訪問VCL對象的屬性或調(diào)用其方法可能會訪問到不被別的線程所保護(hù)的內(nèi)存區(qū)域而產(chǎn)生錯誤。因此,Tthread對象提供了一個Synchronize方法,當(dāng)需要在線程中訪問VCL對象屬性或調(diào)用方法時,通過Synchronize方法來訪問屬性或調(diào)用方法就能避免沖突,使各個線程之間協(xié)調(diào)而不會產(chǎn)生意外的錯誤。如下所示:
  void __fastcall TMyThread::PushTheButton(void)
  
  {
   Button1->Click();
  }
  
  void __fastcall TMyThread::Execute()
  {
   …
   Synchronize((TThreadMethod)PushTheButton);
   …
  }
  對Button1-〉Click()方法的調(diào)用就是通過Synchronize()方法來實現(xiàn)的,它可以自動避免發(fā)生多線程訪問沖突。在C++Builder中,雖然有一些VCL對象也是線程訪問安全的(如Tfont、Tpen、Tbrush等),可以不用Sychronize()方法對它們的屬性方法進(jìn)行訪問調(diào)用以提高程序性能,但是,對于更多的無法確定的VCL對象,還是強烈建議使用Synchronize()方法確保程序的可靠性。
  3. 多線程中公共數(shù)據(jù)的使用
  程序設(shè)計中難免要在多個線程中共享數(shù)據(jù)或者對象。為了避免在多線程中因為同時訪問了公共數(shù)據(jù)塊而造成災(zāi)難性的后果,我們需要對公共數(shù)據(jù)塊進(jìn)行保護(hù),直到一個線程對它的訪問結(jié)束為止。這可以通過臨界區(qū)域(Critical Section)的使用來實現(xiàn),所幸的是在C++Builder中,給我們提供了一個TCriticalSection對象來進(jìn)行臨界區(qū)域的劃定。該對象有兩個方法,Acquire()和Release()。它設(shè)定的臨界區(qū)域可以保證一次只有一個線程對該區(qū)域進(jìn)行訪問。如下例所示:
  class MyThread : public Tthread
  {
   …
  private:
  TCriticalSection pLockX;
  int x;
  float y;
  …
  };
  void __fastcall MyThread::Execute()
  {
  …
  pLockX->Acquire();//Here pLockX is a Global CriticalSection variable.
  x++;
  y=sin(x);
  pLockX->Release();
  …
  }
  這樣,對公共變量x,y的訪問就通過全局TCriticalSection 對象保護(hù)起來,避免了多個線程同時訪問的沖突。
  4. 多線程間的同步
  當(dāng)程序中多個線程同時運行,難免要遇到使用同一系統(tǒng)資源,或者一個線程的運行要依賴另一個線程的完成等等,這樣需要在線程間進(jìn)行同步的問題。由于線程同時運行,無法從程序本身來決定運行的先后快慢,使得線程的同步看起來很難實現(xiàn)。所幸的是Windows系統(tǒng)是多任務(wù)操作系統(tǒng),系統(tǒng)內(nèi)核為我們提供了事件(Event)、Mutex、信號燈(semaphore)和計時器4種對象來控制線程間的同步。在C++Builder中,為我們提供了用于創(chuàng)建Event的Tevent 對象供我們使用。
  當(dāng)程序中一個線程的運行要等待一項特定的操作的完成而不是等待一個特定的線程完成時,我們就可以很方便地用Tevent對象來實現(xiàn)這個目標(biāo)。首先創(chuàng)建一個全局的Tevent對象作為所有線程可監(jiān)測的標(biāo)志。當(dāng)一個線程完成某項特定的操作時,調(diào)用Tevent對象的SetEvent()方法,這樣將設(shè)置這個標(biāo)志,其他的線程可以通過監(jiān)測這個標(biāo)志獲知操作的完成。相反,要取消這個標(biāo)志,可以調(diào)用ResetEvent()方法。在需要等待操作完成的線程中使用WaitFor()方法,將一直等待這個標(biāo)志被設(shè)置為止。注意WaitFor()方法的參數(shù)是等待標(biāo)志設(shè)置的時間,一般用INFINITE表示無限等待事件的發(fā)生,如果其它線程運行有誤,很容易使這個線程死?。ǖ却粋€永不發(fā)生的事件)。
  其實直接用Windows API函數(shù)也可以很方便地實現(xiàn)事件(Event)、信號燈(semaphore)控制技術(shù)。尤其是C++Builder,在調(diào)用Windows API方面有著其它語言無可比擬的優(yōu)勢。所用的函數(shù)主要有:CreateSemaphore()、CreateEvent()、WaitForSingleObject()、ReleaseSemaphore()、SetEvent()等等,這里就不贅述了。
  本文結(jié)合Inprise(Borland)公司開發(fā)的強大的RAD工具C++Builder的編程,對Windows下的多線程編程作了比較全面的介紹。其實多線程的實現(xiàn)并不神秘,看了本文,你也可以編出自己的多線程程序,真正體會多任務(wù)操作系統(tǒng)的威力。
  附:本文是本人在使用C++Builder一年來的一些實踐體會。在完成自己的項目的同時,發(fā)現(xiàn)對多線程的編程一般的書籍都介紹得比較少,而實際應(yīng)用中,多線程編程又是如此的重要,因此,本文通過對多線程編程比較全面的介紹,愿能達(dá)到拋磚引玉之效。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

欧美成人资源| 国产九区一区在线| 欧美一二三区| 国产精品久久亚洲7777| 亚洲精品乱码电影在线观看| 午夜精品国产| 99热免费在线观看| 激情综合激情| 亚洲网站免费观看| 日本在线观看网站| 欧美超碰在线观看| 亚洲自啪免费| www.亚洲一区二区三区| 麻豆国产视频| 亚洲蜜桃精久久久久久久| 成人精品视频一区二区三区尤物| 亚洲人成网站77777在线观看| 天堂v视频永久在线播放| 亚洲欧洲日本精品| 中文字幕在线播放第一页| 亚洲小说区图片| 熟妇高潮一区二区三区| 成人国产视频在线| 天天躁日日躁狠狠躁超碰2020| 精品理论电影| 日本国产在线| 久久久久久久久久久亚洲| av福利在线导航| 久久久久久久久久福利| 日本成人福利| 亚洲摸摸操操av| 全色精品综合影院| 国产喷水福利在线视频| 国产精品欧美三级在线观看| 中文字幕一区二区三区四区五区| 蜜桃传媒一区二区亚洲av| 日韩大片在线永久免费观看网站| 日韩情爱电影在线观看| 4444免费观看| 五月花丁香婷婷| 欧美性受极品xxxx喷水| 成人午夜av影视| 国产成人强伦免费视频网站| 国产精品丝袜一区| 第一中文字幕在线| 成人欧美一区二区三区在线观看| 久久国产精品亚洲va麻豆| 亚洲日本高清| 欧美人成在线观看网站高清| 国产综合成人久久大片91| 国产精品成人无码| 国产视频精品久久| 亚洲国产视频直播| 久久久国产欧美| 国产日韩在线亚洲字幕中文| yourporn久久国产精品| 亚州av综合色区无码一区| 久久精品一区二区三区不卡免费视频| 亚洲小说欧美另类激情| xx00欧美| 亚洲视频在线观看日本a| 欧美性受xxxx黒人xyx性爽| 黄页免费在线观看视频| 国产精品欧美日韩一区二区| 伊人久久大香伊蕉在人线观看热v| 在线观看国产视频一二三| www.看毛片| 亚洲欧美日韩国产精品| 国产精品久久久久久久久婷婷| 欧美日韩亚洲国产综合| 国产国语性生话播放| 国产嫩bbwbbw高潮| 醉酒壮男gay强迫野外xx| 激情五月开心婷婷| 欧美另类videos粗暴黑人| xfplay资源站夜色先锋| 1024成人网| 狠狠色噜噜狠狠色综合久| 15—17女人毛片| 日韩欧美a级成人黄色| 影音先锋电影在线观看| 2020中文字幕在线播放| 亚洲国产精品久久人人爱潘金莲| 国产中文字幕免费| 国产xxxxx| 精品人妻一区二区三区四区| 成人av电影在线播放| 老司机精品免费视频| 亚洲s色大片在线观看| 国产成人高清激情视频在线观看| bestiality新另类大全| 污视频网站免费在线观看| 99久久99精品久久久久久| yellow在线观看网址| 影音av在线| 亚洲伊人观看| 人妻一区二区三区免费| 日韩视频中文字幕在线观看| 欧美网站免费观看| 国产伦精品一区二区免费| 国产精品天美传媒| 在线观看麻豆蜜桃| 三级a三级三级三级a十八发禁止| 成人欧美一区二区三区视频| 欧美成人精品一区二区三区在线看| 欧美亚洲午夜视频在线观看| 北京富婆泄欲对白| 久久午夜精品| 天天综合天天色| 欧美人善zozσ性伦交| 国内精品视频一区二区三区| 日本欧美www| 91福利国产成人精品播放| 50度灰在线| 日韩中文字幕影院| 怡红院在线观看| 久久99精品久久久野外观看| 日本一区二区三区久久久久久久久不| 国产精品99久久久久久成人| 成人免费在线视频网址| 国内精品久久久久影院一蜜桃| 一区二区在线观看免费| 日韩免费在线播放| 18video性欧美19sex高清| www.99久久热国产日韩欧美.com| 欧美体内谢she精2性欧美| 影音先锋中文字幕一区| 国产又猛又黄的视频| 久久99国产精品99久久| 欧洲美熟女乱又伦| 国产视频在线一区二区| 欧美日韩激情视频在线观看| jizz亚洲| 亚洲涩涩在线观看| 米奇777四色精品人人爽| 国产在线精品成人一区二区三区| 狠狠综合久久av一区二区蜜桃| 中文字幕欧美日韩一区二区三区| 97蝌蚪自拍自窝| 小草在线视频在线免费视频| 欧美激情国产日韩精品一区18| 亚洲av无码专区在线播放中文| 亚洲一区中文日韩| 国产亚洲欧美激情| 国产精品国产三级欧美二区| 天天干天天爽| 自拍偷拍亚洲欧美日韩| 激情av网站| 国产大片在线观看| 亚洲调教视频在线观看| 国产精品色午夜在线观看| 手机av在线播放| 成人精品亚洲| 日韩国产一区三区| av在线播放一区| 国产午夜精品福利| 特级毛片在线免费观看| 久久国产精品国语对白| 久久国产精品1区2区3区网页| 国产成人精品免费一区二区| 亚洲第一香蕉视频| 成人性免费视频| 国产精品亚洲一区二区三区| 福利精品视频| 无码精品a∨在线观看中文| 欧美在线亚洲在线| 操你啦在线视频| aⅴ在线免费观看| 少妇饥渴放荡91麻豆| 九色丨porny丨自拍入口| 国产精品伦一区二区三区视频| 无码人妻精品一区二区蜜桃网站| 久久综合久久鬼色| 蜜桃传媒在线观看免费进入| 毛片aaaaaa| 岛国av免费在线观看| 成人福利电影精品一区二区在线观看| 美女又爽又黄| 国产精品麻豆| 永久免费看mv网站入口亚洲| 亚洲精品va在线观看| 少妇一晚三次一区二区三区| 性刺激综合网| 乱色精品无码一区二区国产盗| 国产理论片在线观看| 激情久久久久| 黄色片免费在线观看视频| 国产精品综合av一区二区国产馆| 欧美国产视频日韩| 亚洲国产欧美国产第一区| 青青草国产精品97视觉盛宴| 国产麻豆视频一区| 国产欧美日韩综合精品一区二区| 成人h动漫精品一区二区| 极品美鲍一区| 欧美熟妇另类久久久久久多毛| 亚洲一区二区中文字幕在线观看| www.亚洲成人| 中文字幕精品三区| 久久日一线二线三线suv| 久久久久久久久免费| 国产日韩欧美亚洲一区| 日本久久一区| 国产三级精品在线不卡| 欧美日韩一区二区三区不卡视频| 精品久久久久av影院| 国产精品高潮呻吟| 国产区一区二| 国语自产偷拍精品视频偷| 国产精品久久一级| 超碰av在线免费观看| 亚洲日本一区二区三区在线观看| 欧美色片在线观看| 四虎影院成人在线观看| 亚洲精品不卡在线观看| 成年在线观看免费人视频| 国产又粗又黄视频| 欧美成人一区二区三区四区| 国产精品美女久久久久人| 免费不卡在线观看av| 免费福利影院| 亚洲国产精品激情在线观看| 久久网站最新地址| 一区二区三区日| 97中文字幕在线| 搞黄网站在线观看| 久久综合激情网| 在线视频亚洲| 国内精品久久久久久久久电影网| 性色av一区二区怡红| 日本黄色一区| 国产日韩精品在线播放| 北条麻妃高清一区| 国产伦精品一区二区三区四区免费| 91av手机在线| 五月婷婷亚洲| 精品无码人妻一区二区三| 精品自在线视频| 91久久精品日日躁夜夜躁欧美| 免费男女羞羞的视频网站中文字幕妖精视频| 欧美人妖巨大在线| 国产一区二区在线|播放| 国产亚洲精品久久久久久| 97精品国产福利一区二区三区| 亚洲色图色老头| 国产精品三级电影| 麻豆视频在线| 国产精品第72页| 日本亚洲欧美美色| 国产毛片一区二区三区va在线| 日韩精品一区二区在线视频| 免费av在线播放| 国产女人18毛片18精品| 成人直播在线| 欧美一级做性受免费大片免费| 中文字幕在线二区| 黄漫在线播放| 日本不卡一区二区| 乱色588欧美| 国产精选在线观看| 日本xxxxwwww| 神马午夜精品91| 亚洲国产精品久久久久| 看片网站欧美日韩| 日韩毛片免费观看| 日韩色图在线观看| 国产在线视视频有精品| 欧美a级在线观看| 一区二区不卡久久精品| 一区二区三区黄色| 亚洲天堂网一区二区| 色偷偷偷综合中文字幕;dd| 精品国产视频一区二区三区| 国内精品伊人久久久久影院对白| 午夜日韩在线电影| 色综合网色综合| 日韩精品欧美成人高清一区二区| 欧美色欧美亚洲另类二区精品| 国产综合色精品一区二区三区| 国产精品露脸视频| 日韩精品视频在线观看一区二区三区| 99精品欧美一区二区蜜桃免费| 免费在线观看毛片网站| 男女羞羞网站| 2021久久国产精品不只是精品| 天天干,天天操,天天射| 亚洲欧洲99久久| 五月精品在线| 日本xxxxxxxxxx75| 亚洲一级二级片| 国产精品国产精品国产| 2019中文字幕在线| 欧美日本在线观看| 黄色91视频| 国内揄拍国内精品久久| 亚洲视频在线免费播放| 色悠悠久久综合网| 国产视频精品自拍| 国产午夜亚洲精品午夜鲁丝片| 国产乱人伦精品一区| 麻豆一区二区三区在线观看| 黄色小视网站| 久久99久国产精品黄毛片色诱| 一区二区在线观看视频在线观看| 国产性色av一区二区| 欧美国产日本高清在线| 国产精品女主播| 一区二区三区精品视频在线观看| 日韩欧国产精品一区综合无码| 懂色av粉嫩av蜜乳av| 亚洲欧洲av| 国产免费一区二区| 午夜视频一区二区在线观看| 色综合成人av| 亚洲狠狠丁香婷婷综合久久久| 热re66久久精品国产99热| 九九热线有精品视频99| 欧美视频在线观看一区二区| 3751色影院一区二区三区| 91豆花视频在线播放| 国产片一区二区三区| 天天干天天干天天干天天| 久久激情五月婷婷| 欧美色婷婷久久99精品红桃| 91福利视频在线观看| jlzzjlzz亚洲日本少妇| 亚洲精品乱码久久久久久久| 韩国视频一区二区|