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

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 05:25:59
字體:
來源:轉載
供稿:網友

  還在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 對象就成。

  以上我們初步地實現了在程序中創建一個自定義的線程,并使程序實現了多線程應用。但是,多線程應用的實現,并不是一件簡單的工作,還需要考慮很多使多個線程能在系統中共存、互不影響的因素。比如,程序中公共變量的訪問、資源的分配,假如處理不當,不僅線程會死鎖陷入混亂,甚至可能會造成系統崩潰??偟膩碇v,在多線程編程中要注重共享對象和數據的處理,不能忽視。因此,下面我們要講的就是多線程中常見問題:(未完)
三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案
  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
国产精品www| 日韩专区在线观看| 欧美性高潮床叫视频| 久久影院中文字幕| 日韩精品视频免费在线观看| 17婷婷久久www| 黄色91在线观看| 久久久伊人日本| 国语自产精品视频在线看一大j8| 欧美野外wwwxxx| 中文字幕亚洲在线| 久久综合免费视频影院| 亚洲一区二区三区在线视频| 国产高清在线不卡| 欧美精品午夜视频| 欧美成人一二三| 九九九热精品免费视频观看网站| 欧美激情伊人电影| 久久亚洲国产成人| 国产精品一区二区三区久久久| 欧美美女操人视频| 国产69久久精品成人| 成人在线小视频| 一区二区三区四区在线观看视频| 午夜精品久久久久久久久久久久久| 亚洲美女av在线播放| 91在线观看免费高清完整版在线观看| www.xxxx精品| 日韩在线中文视频| 亚洲成在人线av| 亚洲视频网站在线观看| 精品国产91乱高清在线观看| 欧美最顶级丰满的aⅴ艳星| 亚洲欧洲激情在线| 日韩中文字幕网| 91久久夜色精品国产网站| 中文字幕亚洲色图| 国产深夜精品福利| 国产一区二区三区在线观看视频| 91成人在线观看国产| 亚洲免费小视频| 精品国产一区二区三区在线观看| 国产区亚洲区欧美区| 亚洲精品视频中文字幕| 国产亚洲一区二区精品| 久久久亚洲影院你懂的| 国产精品69久久久久| 欧洲日本亚洲国产区| 日韩欧美在线视频日韩欧美在线视频| 青青在线视频一区二区三区| 国产精品日韩在线| 久久精品久久精品亚洲人| 欧美放荡办公室videos4k| 亚洲图片制服诱惑| 国产精品三级久久久久久电影| 久久高清视频免费| 日韩精品福利网站| 欧美中文在线观看| 久久国产精彩视频| 亚洲视频在线观看网站| 中文字幕国产日韩| 国产精品91久久久| 欧美极品少妇与黑人| 成人午夜在线观看| 国产女人18毛片水18精品| 国产日韩一区在线| 久久国产精品久久精品| 中文字幕国产亚洲| 欧美视频中文字幕在线| 91久久国产精品91久久性色| 亚洲精品一区二区三区不| 91亚洲精品久久久久久久久久久久| 社区色欧美激情 | 亚洲国产精品热久久| 国产欧美久久一区二区| 精品夜色国产国偷在线| 亚洲的天堂在线中文字幕| 日本精品久久中文字幕佐佐木| 国产91免费观看| 成人写真福利网| 中文综合在线观看| 日韩国产一区三区| 88xx成人精品| 国产精品久久久久久久电影| 亚洲第一区中文99精品| 日韩中文字幕视频| 精品国产一区二区在线| 国产欧美日韩亚洲精品| 成人久久久久久久| 中文字幕av日韩| 亚洲精品第一页| 91亚洲精品视频| 91免费精品视频| 琪琪亚洲精品午夜在线| 亚洲第五色综合网| 神马国产精品影院av| 色黄久久久久久| 亚洲一区二区三区四区在线播放| 日韩久久免费视频| 精品国产欧美一区二区三区成人| 亚洲一区二区久久久久久| 91精品久久久久久久久久入口| 伊人亚洲福利一区二区三区| 日本韩国欧美精品大片卡二| 97视频在线播放| 色偷偷综合社区| 欧美日韩精品在线| 亚洲综合视频1区| 亚洲一区av在线播放| 成人国产精品一区| 性色av一区二区三区在线观看| 亚洲第一精品久久忘忧草社区| 26uuu亚洲伊人春色| 亚洲综合成人婷婷小说| 久久99热这里只有精品国产| 欧美成人免费小视频| 欧美激情第1页| 在线性视频日韩欧美| 国产成人精品一区二区| 日韩激情片免费| 欧美日韩成人在线视频| 日产精品久久久一区二区福利| 亚洲色图欧美制服丝袜另类第一页| 国产精品永久免费在线| 国产一区欧美二区三区| 中文精品99久久国产香蕉| 亚洲欧美色图片| 久久精品一偷一偷国产| 亚洲在线第一页| 91久久国产精品91久久性色| 亚洲专区在线视频| 97视频在线观看网址| 精品久久久国产| 久久久在线视频| 中文字幕日韩电影| 91精品久久久久久久久久久久久| 国产91精品久久久久久久| 欧美一区二区三区免费视| 亚洲国产精品字幕| 久久亚洲精品中文字幕冲田杏梨| 亚洲激情国产精品| 亚洲老头老太hd| xxxxx91麻豆| 国产精品成人一区二区| 茄子视频成人在线| 欧美性xxxxxxx| 亚洲qvod图片区电影| 97精品一区二区三区| 日本精品一区二区三区在线播放视频| 91av在线网站| 成人乱人伦精品视频在线观看| 欧美日韩国产va另类| 欧美亚洲一区在线| 91精品国产成人| 欧美极品美女视频网站在线观看免费| 国产在线精品一区免费香蕉| 久久成人精品一区二区三区| 亚洲三级 欧美三级| 亚洲欧美日韩精品| 一区二区三区黄色| 日韩有码在线电影| 欧美中文字幕视频在线观看| 国产精品综合久久久| 98精品在线视频|