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

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

在C++Builer中多線程的實現

2019-09-06 23:33:44
字體:
來源:轉載
供稿:網友

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久夜精品香蕉| 亚洲激情中文字幕| 亚洲欧美国产精品专区久久| 欧美一区视频在线| 亚洲精品国产电影| 尤物tv国产一区| 69av成年福利视频| 成人高h视频在线| 91sa在线看| 久久久999精品免费| 欧美日韩日本国产| 欧美日韩中文字幕在线| 成人午夜两性视频| 国产精品久久99久久| 久久99精品久久久久久琪琪| 欧美日韩亚洲激情| 97在线视频免费播放| 久久久这里只有精品视频| 国产国语videosex另类| 国产日韩欧美电影在线观看| 国产午夜精品一区二区三区| 人妖精品videosex性欧美| 久久人人爽国产| 日韩av大片在线| 国产成人黄色av| 亚洲男人的天堂在线| 国外日韩电影在线观看| 91久热免费在线视频| 国产成一区二区| 亚洲女人天堂色在线7777| 91精品国产精品| 亚洲另类图片色| 亚洲成人久久久久| 欧美激情视频一区| 欧美激情欧美激情| 亚洲成人性视频| 91精品国产高清久久久久久久久| 欧美激情小视频| 日韩精品免费看| 亚洲色图15p| 欧美日韩第一视频| 狠狠干狠狠久久| 亚洲精品日产aⅴ| 久久国产精品99国产精| 久久色免费在线视频| 欧美大尺度电影在线观看| 亚洲精品狠狠操| 中文字幕免费精品一区高清| 欧美激情综合亚洲一二区| 国产在线视频不卡| 久久深夜福利免费观看| 欧美日韩美女在线观看| 欧美老女人在线视频| 精品福利樱桃av导航| 午夜欧美不卡精品aaaaa| 久久成人av网站| 国产精品中文久久久久久久| 成人免费观看网址| 亚洲第一精品福利| 欧美性xxxx18| 精品国产电影一区| 成人性生交大片免费看小说| 激情久久av一区av二区av三区| 国内外成人免费激情在线视频网站| 久久久久久久电影一区| 日韩av成人在线观看| 日韩激情视频在线播放| 日本韩国欧美精品大片卡二| 精品国产拍在线观看| 欧美成人中文字幕在线| 激情亚洲一区二区三区四区| 日韩精品在线观看网站| 亚洲va久久久噜噜噜久久天堂| 欧美激情在线有限公司| 亚洲欧美福利视频| 九九热精品视频| 欧美性xxxxx极品娇小| 亚洲国产精品视频在线观看| 国产精品扒开腿做爽爽爽男男| 国产精品高精视频免费| 国产精品永久在线| 91精品视频大全| 亚洲日韩欧美视频一区| 国产精品自拍网| 中文字幕日韩综合av| 自拍偷拍亚洲精品| 91色视频在线观看| 亚洲欧美一区二区三区在线| 亚洲国产精品热久久| 亚洲精品国精品久久99热| 久久精品成人动漫| 日韩欧美精品免费在线| 欧美精品日韩三级| 北条麻妃久久精品| 精品高清美女精品国产区| 国产一区二区动漫| 中文字幕av一区中文字幕天堂| 午夜免费日韩视频| 亚洲精品久久在线| 国产成人精品优优av| 欧美一级黑人aaaaaaa做受| 日韩精品免费在线| 欧美有码在线视频| 久久中国妇女中文字幕| 精品久久久久久久久久国产| 欧美精品九九久久| 欧美人在线观看| 国产有码一区二区| 岛国av午夜精品| 日韩欧美在线看| 精品国产老师黑色丝袜高跟鞋| 久久99精品久久久久久琪琪| 亚洲一区二区自拍| 国产主播喷水一区二区| 成人久久一区二区三区| www.亚洲一二| 日韩av中文字幕在线| 欧美日在线观看| 97免费视频在线播放| 精品无人区乱码1区2区3区在线| 亚洲娇小xxxx欧美娇小| 国产日韩在线免费| 久久亚洲影音av资源网| 精品久久久av| 精品久久久久久久久久久久久| 亚洲精品动漫100p| 亚洲第一精品福利| 亚洲人成网站免费播放| 国产97色在线|日韩| 久久精品视频在线播放| 欧美xxxx18性欧美| 欧美精品一区三区| 自拍视频国产精品| 日韩中文字幕在线视频| 亚洲欧美日韩在线一区| 日韩精品免费电影| 色视频www在线播放国产成人| 国产精品日韩在线观看| www国产亚洲精品久久网站| 欧美激情在线一区| 亚洲黄色www网站| 96sao精品视频在线观看| 国产欧美va欧美va香蕉在线| 88国产精品欧美一区二区三区| 国产精品永久免费| 九九久久精品一区| 国产精品日韩在线观看| 最好看的2019的中文字幕视频| 亚洲激情成人网| 久久国产精品99国产精| 1769国内精品视频在线播放| 国产欧美一区二区白浆黑人| 在线播放国产一区中文字幕剧情欧美| 91在线观看免费高清完整版在线观看| 欧美一级电影免费在线观看| 久久99热精品这里久久精品| 国产精品一区二区三| 欧美中文字幕视频在线观看| 亚洲综合自拍一区| xvideos成人免费中文版| 欧美放荡办公室videos4k| 亚洲日本欧美中文幕| 北条麻妃一区二区在线观看| 亚洲码在线观看|