還在Dos時代,人們就在尋求一種多任務的實現(xiàn)。于是出現(xiàn)了TSR類型的后臺駐留程序,比較有代表性的有Side Kick、Vsafe等優(yōu)秀的TSR程序,這類程序的出現(xiàn)和應用確實給用戶使用計算機帶來了極大的方便,比如Side Kick,我們編程可以在不用進編輯程序的狀態(tài)下,一邊編輯源程序,一邊編譯運行,非常方便。但是,Dos單任務操作系統(tǒng)的致命缺陷注定了在Dos下不可能開發(fā)出真正的多任務程序。進入Windows3.1時代,這種情況依然沒有根本的改變,一次應用只能做一件事。比如數(shù)據(jù)庫查詢,除非應用編得很好,在查詢期間整個系統(tǒng)將不響應用戶的輸入。
進入了Windows NT和Windows 9x時代,情況就有了徹底的改觀,操作系統(tǒng)從真正意義上實現(xiàn)了多任務(嚴格地說,Win9x還算不上)。一個應用程序,在需要的時候可以有許多個執(zhí)行線程,每個線程就是一個小的執(zhí)行程序,操作系統(tǒng)自動使各個線程共享CPU資源,確保任一線程都不能使系統(tǒng)死鎖。這樣,在編程的時候,可以把費時間的任務移到后臺,在前臺用另一個線程接受用戶的輸入。對那些對實時性要求比較高的編程任務,如網(wǎ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)的任務的代碼所在處。在原代碼中包含Unit2.cpp,這個由我們創(chuàng)建的TMyThread對象就可以使用了。使用時,動態(tài)創(chuàng)建一個TMyThread 對象,在構造函數(shù)中使用Resume()方法,那么程序中就增加了一個新的我們自己定義的線程TMyThread,具體執(zhí)行的代碼就是Execute()方法重載的代碼。要加載更多的線程,沒關系,只要繼續(xù)創(chuàng)建需要數(shù)量的TMyThread 對象就成。
以上我們初步地實現(xiàn)了在程序中創(chuàng)建一個自定義的線程,并使程序實現(xiàn)了多線程應用。但是,多線程應用的實現(xiàn),并不是一件簡單的工作,還需要考慮很多使多個線程能在系統(tǒng)中共存、互不影響的因素。比如,程序中公共變量的訪問、資源的分配,如果處理不當,不僅線程會死鎖陷入混亂,甚至可能會造成系統(tǒng)崩潰??偟膩碇v,在多線程編程中要注意共享對象和數(shù)據(jù)的處理,不能忽視。

