国产黄色免费网站,人人干人人干人人干,免费大黄网站在线看,国产情侣一区二区三区,99精品国产福利免费一区二区,国产亚洲成归v人片在线观看,伊人88

2023信創(chuàng)獨角獸企業(yè)100強
全世界各行各業(yè)聯(lián)合起來,internet一定要實現(xiàn)!

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

2004-02-14 eNet&Ciweek

  2. 多線程中VCL對象的使用

  我們都知道,C++Builder編程是建立在VCL類庫的基礎(chǔ)上的。在程序中經(jīng)常需要訪問VCL對象的屬性和方法。不幸的是,VCL類庫并不保證其中對象的屬性和方法是線程訪問安全的(Thread_safe),訪問VCL對象的屬性或調(diào)用其方法可能會訪問到不被別的線程所保護的內(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()方法對它們的屬性方法進行訪問調(diào)用以提高程序性能,但是,對于更多的無法確定的VCL對象,還是強烈建議使用Synchronize()方法確保程序的可靠性。

  3. 多線程中公共數(shù)據(jù)的使用

  程序設(shè)計中難免要在多個線程中共享數(shù)據(jù)或者對象。為了避免在多線程中因為同時訪問了公共數(shù)據(jù)塊而造成災(zāi)難性的后果,我們需要對公共數(shù)據(jù)塊進行保護,直到一個線程對它的訪問結(jié)束為止。這可以通過臨界區(qū)域(Critical Section)的使用來實現(xiàn),所幸的是在C++Builder中,給我們提供了一個TCriticalSection對象來進行臨界區(qū)域的劃定。該對象有兩個方法,Acquire()和Release()。它設(shè)定的臨界區(qū)域可以保證一次只有一個線程對該區(qū)域進行訪問。如下例所示:

  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. 多線程間的同步

  當(dāng)程序中多個線程同時運行,難免要遇到使用同一系統(tǒng)資源,或者一個線程的運行要依賴另一個線程的完成等等,這樣需要在線程間進行同步的問題。由于線程同時運行,無法從程序本身來決定運行的先后快慢,使得線程的同步看起來很難實現(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á)到拋磚引玉之效。

相關(guān)頻道: eNews

您對本文或本站有任何意見,請在下方提交,謝謝!

投稿信箱:tougao@enet16.com