国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

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

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

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

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产免费视频| www操操操| 国产精品自产拍在线观看2019| 精品视频一区二区观看| 天堂在线免费av| 中文字幕乱在线伦视频乱在线伦视频| 久久久久久久久久久久网站| 国产一级片在线播放| 国产福利片在线| 午夜影院在线| 国产探花在线观看| 日韩中文字幕久久久经典网| 国产女王在线**视频 | 欧美午夜电影一区二区三区| 国产中文在线| 中文乱码字幕高清在线观看| 欧美a免费在线| 国产精品欧美韩国日本久久| 亚洲an天堂an在线观看| 中文字幕视频免费在线观看| 国产超级va在线视频| 开心婷婷激情五月| 国产成人午夜| 天天操天天曰| 亚洲精品久久久成人| 国产天堂在线观看| 男人天堂亚洲| 永久av在线| 国产aa视频| 国产精品久久久高清免费| 欧美日韩在线资源| 三级小说一区| 在线免费国产| 中文字幕av高清在线观看| 国产系列电影在线播放网址| 狠狠操天天操夜夜操| 午夜影院免费看| 亚洲精品在线播放视频| 国产啊啊啊视频在线观看| 国产色a在线| 国产系列电影在线播放网址| 丁香婷婷在线| 成av人免费青青久| 免费在线黄色av| 久热国产在线视频| 国产美女自拍视频| 国产中文伊人| 中文字幕欧美日韩在线不卡| 国产一级二级三级在线观看| 国产精品冒白浆免费视频| 国产区av在线| 中文岛国精品亚洲一区| 在线一区观看| 天天噜天天色| 国产毛片毛片| 精品99又大又爽又硬少妇毛片| 精品51国产黑色丝袜高跟鞋| 精品国产高清自在线一区二区三区 | 精品国语对白精品自拍视| 五月婷婷导航| 在线亚洲精品自拍| 欧美性猛交xxxxbbbb| 国产在线资源| 精品一区二区三区在线成人| 亚洲午夜久久久久中文字幕| 久久五月精品| 国产精品视频一区二区图片| 国产99在线|亚洲| 欧美性xxxx交| 国产人成精品| 久久国产情侣| 精品一区二区91| 国产免费黄视频在线观看| 2021天堂中文幕一二区在线观| 亚洲男人的天堂成人| 高潮毛片在线观看| 在线中文字幕视频观看| 国产原创av在线| 2019中文字幕视频| 久久这里精品| 中文一区在线观看| 91xxx在线观看| www.狠狠色.com| 国产裸舞福利在线视频合集| 精品一区二区三区在线观看l| 九九视频精品在线| 亚洲第一成人在线视频| 国产黄色在线网站| 最近中文字幕在线中文视频| 超碰免费在线播放| 青草视频在线播放| 欧美日韩综合高清一区二区| 伊人222成人综合网| 国产午夜在线观看| 1区不卡电影| 国产网站免费看| 免费女人毛片视频| 在线久久视频| 亚洲综合在线网| 在线免费观看你懂的| 国产视频中文字幕| 日本中文字幕在线播放| 高清在线观看av| 国产美女在线免费观看| 开心丁香婷婷深爱五月| 欧美啪啪精品| 91sp网站在线观看入口| 中文字幕视频在线观看| 国产小视频在线播放| 国产羞羞视频在线播放| 国产青青草在线| 国产视频一二区| 999在线视频| 欧美日韩在线精品成人综合网| www.成人.com| 免费在线观看a| 国产香蕉免费精品视频| 国产二区在线播放| 精品成人免费自拍视频| 中文资源在线官网| www.狠狠操.com| 1区2区视频| 亚洲欧美小说国产图片| 狠狠干在线视频| 国产精品国产国产aⅴ| 在线国产福利网站| 久热免费在线视频| 国产激情视频在线观看| 天堂√中文在线| 天天操天天射天天色| 中文一区在线观看| 狠狠干婷婷色| 国产精品伦一区二区三区级视频频 | 午夜免费福利在线观看| 国产黄色免费网站| 青草视频在线播放| 91在线视频免费看| 国产乱码在线| av在线免费观看网| 中文字幕在线影院| 碰草在线视频| 伊人网在线观看| 国产三级视频在线看| 人人在线视频| 伊人中文在线| 精品美女在线观看视频在线观看| 国产中文在线视频| 欧美日韩不卡中文字幕在线| 国产精品久久久久永久免费看| 开心激情五月婷婷| 亚洲视频手机在线观看| 国产精品久久久久久福利| 九九热在线视频免费观看| 亚洲wwwwww| 精品视频二区| 国产h在线观看| 国产精品白浆视频免费观看| 国产一级片在线| 国产一级网站视频在线| 91av资源在线| 最新中文字幕在线视频| 福利资源在线久| 成年网在线观看免费观看网址| 在线看a视频| 亚洲欧美精品日韩欧美| 中文字幕av高清在线观看| 国产精品186在线观看在线播放| 麻豆视频在线观看免费网站 | 国产视频青青| 中文字幕不卡免费视频| 午夜视频在线看| 国产精彩视频在线观看免费蜜芽| 国产视频福利| 一区免费观看| 久热久精久品这里在线观看| 国产蜜臀av在线播放| 国产一级免费黄色片| 2019中文字幕在线电影免费| 精品国产二区三区| 色欧美在线观看| 国产美女高潮| 97视频免费| 久久五月精品| 午夜伦全在线观看| 国产99re| 国产综合视频一区二区三区免费| 中文字幕在线视频网| 精品美女调教视频| 青青国产在线| 国产黄色大片在线观看| 轻轻色免费在线视频| 国产深夜福利| 开心婷婷激情五月| 国产福利热线视频| 久久久久久77777| 精品一区二区三区在线成人| 男女午夜视频在线观看| 精品国语对白精品自拍视| 欧美在线中文| 精品卡1卡2卡三卡免费网站|