Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

THREAD trong DELPHI.doc
Nội dung xem thử
Mô tả chi tiết
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
1 GIÔÙI THIEÄU THREAD TRONG DELPHI................................................................3
1.1 THREAD LAØ GÌ?....................................................................................................................................3
1.2 ÖÙNG DUÏNG CUÛA THREAD........................................................................................................................3
1.3 SÖÛ DUÏNG TTHREAD TRONG DELPHI..........................................................................................................4
1.3.1 Caùc method ñaùng chuù yù khi vieát Thread..................................................................................5
1.3.2 Caùc property ñaùng chuù yù khi vieát Thread................................................................................6
1.3.3 Tranh chaáp döõ lieäu khi vieát multi-thread.................................................................................7
1.3.4 Söû Duïng Critical Section trong chöông trình............................................................................9
2 GIAO TIEÁP GIÖÕA CAÙC MAÙY MOÂ HÌNH CLIENT/SERVER ..............................9
2.1 TCLIENTSOCKET................................................................................................................................10
2.1.1 Ghi döõ lieäu ñeán server............................................................................................................10
2.1.2 Ñoïc döõ lieäu töø server..............................................................................................................11
2.2 TCLIENTWINSOCKET..........................................................................................................................11
2.3 TSERVERSOCKET.................................................................................................................................12
2.3.1 Truyeàn döõ lieäu ñeán moät Client...............................................................................................13
2.3.2 Ñoïc döõ lieäu töø moät client........................................................................................................13
2.3.3 Baïn coù theå bieát chính xaùc Client thöù maáy ñaõ göûi döõ lieäu ñeán server socket.........................14
2.4 TSERVERWINSOCKET.........................................................................................................................14
2.4.1 Laéng nghe yeâu caàu keát noái cuûa Client...................................................................................14
2.4.2 Quaûn lyù daõy caùc client socket ñaõ keát noái vôùi server socket...................................................15
2.5 TSERVERCLIENTWINSOCKET................................................................................................................15
3 GIÔÙI THIEÄU CHÖÔNG TRÌNH ...............................................................................16
3.1 NOÄI DUNG VAØ YÙ NGHÓA CHÖÔNG TRÌNH.....................................................................................................16
3.2 CAÙC VAÁN ÑEÀ CHÍNH CAÀN GIAÛI QUYEÁT.......................................................................................................20
3.2.1 Toå chöùc döõ lieäu trong chöông trình........................................................................................20
3.2.2 Keát noái cho client...................................................................................................................21
3.2.3 Huûy keát noái cho client............................................................................................................22
3.2.4 Tranh chaáp döõ lieäu.................................................................................................................22
3.2.5 Duøng thread ñeå phaân chia CPU cho caùc thao taùc cuûa client..................................................22
3.3 CAÙC CHÖÙC NAÊNG CHO NGÖÔØI QUAÛN LYÙ.....................................................................................................23
3.3.1 Tìm kieám moät nhaø..................................................................................................................24
3.3.2 Laáy thoâng tin cuûa moät nhaø.....................................................................................................25
3.3.3 Theâm thoâng tin moät nhaø môùi..................................................................................................26
3.3.4 Xoùa thoâng tin moät nhaø............................................................................................................28
3.3.5 Caäp nhaät thoâng tin moät nhaø....................................................................................................29
3.3.6 Thoáng keâ soá nhaø ñaõ cho thueâ.................................................................................................31
3.3.6.1 Ñeám soá nhaø ñaõ cho thueâ.................................................................................................31
3.3.6.2 Ñöa moät nhaø ñaõ heát haïn cho thueâ veà danh saùch caùc nhaø coù theå cho thueâ......................32
3.3.7 Thoáng keâ soá nhaø ñaõ baùn.........................................................................................................36
3.3.7.1 Ñeám soá nhaø ñaõ baùn.........................................................................................................36
3.4 CAÙC CHÖÙC NAÊNG CHO NGÖÔØI CAÄP NHAÄT THOÂNG TIN NHAØ..............................................................................37
3.4.1 Tìm kieám moät nhaø..................................................................................................................38
3.4.2 Laáy thoâng tin cuûa moät nhaø.....................................................................................................38
3.4.3 Caäp nhaät thoâng tin moät nhaø....................................................................................................38
3.4.4 Theâm thoâng tin moät nhaø môùi..................................................................................................39
3.4.5 Xoùa thoâng tin moät nhaø............................................................................................................39
1
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
3.5 CAÙC CHÖÙC NAÊNG CHO MOÄT KHAÙCH HAØNG..................................................................................................40
3.5.1 Laáy thoâng tin veà moät nhaø.......................................................................................................40
3.5.2 Tìm kieám moät nhaø..................................................................................................................40
3.5.3 Tìm kieám theo ñieàu kieän........................................................................................................41
3.5.4 Ñaêng kyù thueâ nhaø...................................................................................................................46
3.5.5 Ñaêng kyù mua nhaø...................................................................................................................50
3.6 MAÕ CHÖÔNG TRÌNH KINH DOANH NHAØ ÑAÁT TREÂN MAÏNG CLIENT/SERVER..........................................................53
3.6.1 Nha.dpr...................................................................................................................................53
3.6.2 Nhaf.pas.................................................................................................................................54
3.6.3 ConectDlg.pas........................................................................................................................75
3.6.4 Findf.pas.................................................................................................................................78
3.6.5 HomeInfo.pas.........................................................................................................................82
3.6.6 HomeTools.pas.......................................................................................................................85
3.6.7 Informf.pas...........................................................................................................................102
3.6.8 InputThuef.pas.....................................................................................................................104
3.6.9 MytdRTF.pas........................................................................................................................106
3.6.10 MyThread.pas....................................................................................................................110
3.6.11 RepThuef.pas.....................................................................................................................126
2
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
1 Giôùi thieäu Thread trong Delphi
1.1 Thread laø gì?
Tính naêng Thread cho pheùp moät chöông trình xöû lyù ñoàng thôøi nhieàu coâng vieäc. Chaúng
haïn trong chöông trình Go!Zilla Ver 3.2 Copyright 1997-98 Gizmonet, moät luùc coù theå
download nhieàu file töø cuøng hoaëc nhieàu website khaùc nhau. Noù coøn cho ngöôøi duøng
ñònh ñoä öu tieân cho töøng thread.
Baïn coù theå duøng BorlandC, Delphi, Cbuilder, Visual C ... ñeå vieát neân nhöõng chöông
trình coù tính naêng thread. Nhöng duø baïn laäp trình baèng ngoân ngöõ naøo ñi chaêng nöõa, thì
cuõng phaûi söû duïng nhöõng haøm API cuûa Microsoft cung caáp nhö CreateThread,
SetThreadPriority ... moät caùch tröïc tieáp hoaëc giaùn tieáp.
1.2 ÖÙng duïng cuûa Thread
Thread ñöôïc söû duïng raát nhieàu treân caùc lónh vöïc nhö ñoà hoïa (xöû lyù nhieàu hình aûnh moät
luùc), trong troø chôi (laøm neàn hoaëc moãi nhaân vaät trong troø chôi laø moät thread), truyeàn tin
(tín hieäu xuaát ra ñöôïc xöû lyù töùc thôøi) ...
Thread laøm cho chöông trình trôû neân ñôn giaûn, deã hieåu khi ta phaûi vieát nhöõng chöông
trình ñoøi hoûi xöû lyù ñoàng thôøi nhieàu coâng vieäc.
3
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3 Söû duïng TThread trong Delphi
Söû duïng TThread cuûa Delphi ñeå vieát neân nhöõng chöông trình coù tính naêng Thread thì
raát deã. Caáu truùc cô baûn moät unit coù söû duïng Thread nhö sau :
unit Unit1;
interface
uses
Classes;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ TMyThread }
procedure TMyThread.Execute;
begin
{ phaàn maõ coù tính naêng Thread ñaët ôû ñaây}
end;
end.
Moät ñieàu quan troïng caàn löu yù khi vieát Thread laø nhöõng ñoái töôïng hay haøm naøo naèm
trong thö vieän VCL cuûa Delphi phaûi goïi baèng phöông phaùp Synchronize.
Ví duï :
Synchronize(UpdateCaption);
Vôùi UpdateCaption :
4
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
procedure TMyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
1.3.1 Caùc method ñaùng chuù yù khi vieát Thread
* Constructor Create(CreateSuspended: Boolean);
Constructor Create ñeå khôûi taïo moät ñoái töôïng Thread.
Neáu CreateSuspended = False, Execute ñöôïc goïi ngay laäp töùc
Neàu CreateSuspended = True, Execute khoâng ñöôïc goïi cho ñeán khi Resume ñöôïc goïi.
* Destructor Destroy; override;
Destructor Destroy huûy ñoái töôïng thread vaø giaûi phoùng boä nhôù noù chieám giöõ.
* Procedure DoTerminate; virtual;
DoTerminate laøm cho thread goïi söï kieän OnTerminate.
* Procedure Execute; virtual; abstract;
Procedure Execute laø moät method abstract phaûi ñöôïc override bôûi lôùp con. Noù chöùa maõ
khi baét ñaàu Thread.
* Procedure Resume;
Procedure Resume tieáp tuïc goïi moät thread taïm ngöng.
* Procedure Suspend;
Procedure Suspend taïm ngöng moät thread ñang chaïy.
* Procedure Synchronize(Method: TThreadMethod);
Procedure Synchronize thöïc hieän method duøng thö vieän VCL.
* Procedure Terminate;
Procedure Terminate ra hieäu cho thread döøng baèng caùch gaùn property Terminated laø
True.
5
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3.2 Caùc property ñaùng chuù yù khi vieát Thread
* property FreeOnTerminate: Boolean;
property FreeOnTerminate ñònh cho ñoái töôïng thread töï ñoäng giaûi phoùng nhôù neáu
FreeOnTerminate = True.
* property Handle: Thandle;
property Handle laø handle cuûa thread.
* property Priority: TThreadPriority;
property Priority xaùc ñònh ñoä öu tieân giöõa caùc thread khaùc trong tieán trình.
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
tpTimeCritical);
+ tpIdle : Chæ thöïc hieän khi heä thoáng Windows raûnh roãi, noù khoâng ngaét ngang ñoái
töôïng thread khaùc ñeå chaïy.
+ tpLowest : Möùc ñoä öu tieân döôùi 2 ñieåm so vôùi bình thöôøng.
+ tpLower : Möùc ñoä öu tieân döôùi 1 ñieåm so vôùi bình thöôøng.
+ tpNormal: Möùc ñoä öu tieân bình thöôøng.
+ tpHigher : Möùc ñoä öu tieân treân 1 ñieåm so vôùi bình thöôøng.
+ tpHigher : Möùc ñoä öu tieân treân 1 ñieåm so vôùi bình thöôøng.
+ tpHighest : Möùc ñoä öu tieân treân 2 ñieåm so vôùi bình thöôøng.
+ tpTimeCritical : Möùc ñoä öu tieân cao nhaát.
* property Suspended: Boolean;
property Suspended chæ ñònh thread taïm ngöng neáu baèng true.
* property Terminated: Boolean;
property Terminated chæ ñònh raèng thread yeâu caàu döøng neáu baèng true.
* property ThreadID: THandle;
property ThreadID nhaän bieát duy nhaát cho ñoái töôïng thread xuyeân suoát heä thoáng.
ThreadID thì khaùc property Handle.
6
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3.3 Tranh chaáp döõ lieäu khi vieát multi-thread
Khi baïn vieát moät chöông trình multi-threaded, coù tröôøng hôïp 2 thread cuøng truy caäp ñeán
moät vuøng döõ lieäu, chaúng haïn nhö laø moät file, ñieàu naøy coù theå laøm cho file bò hö hoaëc coù
theå maùy cuûa baïn seõ bò treo. Ñeå giaûi quyeát vaán ñeà naøy, baïn seõ cho caùc thread khaùc
khoâng theå truy caäp ñeán vuøng nhôù maø thread hieän haønh ñang söûa ñoåi döõ lieäu cho ñeán khi
döõ lieäu ñöôïc xöû lyù xong.
Critical sections ñöôïc thieát keá maø moät phaàn resource ñöôïc duøng rieâng bieät vaø taùch rôøi
khoûi caùc tieán trình khaùc. Baïn haõy töôûng töôïng raèng coù hai ngöôøi cuøng ñi song song treân
moät con ñöôøng, boãng nhieân xuaát hieän moät caây caàu heïp, chæ ñuû ñeå moät ngöôøi ñi qua.
Bình thöôøng moät ngöôøi seõ nhöôøng ñöôøng cho ngöôøi kia ñi tröôùc. Khi maø moät ngöôøi qua
caàu roài thì ngöôøi kia seõ tieáp tuïc ñi qua caàu vaø hoï laïi tieáp tuïc ñi song song vôùi nhau.
Critical sections cuõng töông töï nhö vieäc ñi qua caàu. Baïn haõy nhìn hình ôû treân ñaây, hai
thread (muõi teân maøu cyan) ñang chaïy treân tieán trình ñôn (vuøng maøu ñen), khi caùc thread
chaïy ñeán critical sections (vuøng maøu xanh döông), moät thread seõ nhöôøng cho thread kia
ñi qua. Trong thöïc teá, moät thread seõ ñi ñeán critical sections, noù coù theå taïo ra moät côø ra
hieäu cho caùc thread khaùc khoâng ñöôïc lieân laïc vôùi data.
Ñeå thöïc hieän critacal sections trong maõ chöông trình vieát baèng Borland Delphi, baïn haõy
laøm daáu khoái treân moãi thread maø truy caäp ñeán vuøng nhôù chung baèng caùc haøm
EnterCriticalSection vaø LeaveCriticalSection. Ñieàu ñaàu tieân, trong chöông trình,
baïn phaûi ñònh nghóa moät critical treân boä nhôù. Ñieàu naøy thöïc hieän ñöôïc baèng caùch goïi
haøm InitializeCriticalSection. Haøm naøy ñöôïc khai baùo nhö sau:
procedure InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection); stdcall;
7
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
InitializeCriticalSection laáy moät tham soá kieåu TRTLCriticalSection, maø tröôøng cuûa noù
löu tröõ thoâng tin veà critical section. Baïn khoâng caàn quan taâm veà caáu truùc cuûa noù, bôûi bì
chaúng caàn thao taùc treân ñoù. Haõy khai baùo moät bieán toaøn cuïc kieåu TRTLCriticalSection.
Sau khi laøm critical xong, haõy huûy noù baèng haøm DeleteCriticalSection. Cuõng gioáng
nhö InitializeCriticalSection, haøm naøy coù moät tham soá kieåu TRTLCriticalSeciont.
Trong tröôøng hôïp naøy, hai tham soá bieán trong DeleteCriticalSection vaø
InitializeCriticalSection laø moät. Trong chöông trình baïn haõy goõ vaøo caùc leänh sau:
unit myCritical;
Interface
var
CritSect : TRTLCriticalSection;
…
Implementation
…
initialization
InitializeCriticalSection(CritSect);
finalization
DeleteCriticalSection(CritSect);
end.
8
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3.4 Söû Duïng Critical Section trong chöông trình
Ñaët critical section ñeå duøng trong thread thì raát deã. Baïn chæ caàn xem moät ñoaïn maõ ví duï
döôùi ñaây thì seõ bieát ngay:
procedure TMyThread.ChangeData;
begin
...
EnterCriticalSection(CritSect);
...Caùc thao taùc söûa ñoåi döõ lieäu duøng chung ñaët ôû ñaây
LeaveCriticalSection(CritSect);
end;
2 Giao tieáp giöõa caùc maùy moâ hình Client/Server
Trong ñeà taøi thöïc taäp naøy, ta duøng ngoân ngöõ laäp trình Delphi ñeå giao tieáp giöõa caùc maùy
qua moâ hình Client/Server, cuï theå laø söû duïng caùc control nhö : TClientSocket,
ClientWinSocket, TServerSocket, TServerWinSocket. Hình döôùi ñaây lieät keâ caùc lôùp
cuûa socket control:
9
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
2.1 TClientSocket
TClientSocket ñöôïc duøng ñeå keát noái ñeán moät Server Socket. Ñeå söû duïng control naøy,
baïn neân laøm caùc thao taùc sau ñaây:
(1) Vieát maõ cho OnRead Event
(2) Ñònh Address property ñeán Server address.
(3) Ñònh Port laø giaù trò Port Property cuûa TServerSocket muoán keát noái.
(4) Ñònh ClientType property ñeán ctNonBlocking.
(5) Goïi Open method ñeå keát noái ñeán remote Server.
Ta noùi theâm veà ClientType property.
Neáu ClientType = ctNonBlocking, khi chöông trình ñoïc hay ghi döõ lieäu ñeán socket,
chöông trình seõ thöïc hieän leänh I/O naøy roài tieáp tuïc thöïc hieän chöông trình ngay caû thao
taùc I/O naøy chöa thöïc hieän xong.
Neáu ClientType = ctBlocking, chöông trình seõ taïm khoâng chaïy tieáp maø chôø cho ñeán khi
thao taùc I/O thöïc hieän xong.
Trong chöông trình naøy, ta seõ cho ClientType = ctNonBlocking.
2.1.1 Ghi döõ lieäu ñeán server
Khi baïn muoán göûi döõ lieäu ñi, duøng leänh töông töï nhö sau:
MyClientSocket.Socket.SendText("this is a test");
TClientSocket TClientWinSocket
Hoaëc duøng leänh:
BytesWritten := MyClientSocket.Socket.SendBuf(buf, count);
10
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
2.1.2 Ñoïc döõ lieäu töø server
Baïn coù theå ñoïc döõ lieäu töø Server baèng caùch duøng leänh ReceiveText hay ReceiveBuf ñaët
trong OnRead Event.
procedure TChatForm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
StringData := Socket.ReceiveText;
end;
2.2 TClientWinSocket
Ta seõ moâ taû moät soá haøm quan troïng trong TClientWinSocket.
function ReceiveBuf(var Buf; Count: Integer): Integer;
ReceiveBuf ñoïc döõ lieäu töø server socket, soá byte ñoïc do ngöôøi duøng ñònh. Döõ lieäu ñoïc
ñöôïc seõ chöùa trong Buf, giaù trò traû veà laø soá byte ñaõ thöïc söï ñoïc ñöôïc.
function ReceiveText: string;
Duøng ReceiveText ñeå ñoïc moät chuoãi töø server socket.
function SendBuf(var Buf; Count: Integer): Integer;
Duøng SendBuf ñeå truyeàn döõ lieäu trong Buf ñeán server socket. Haøm naøy traû veà soá byte
thöïc söï ñaõ truyeàn.
procedure SendText(const S: string);
Duøng SendText ñeå truyeàn moät chuoãi ñeán server socket.
11
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
function SendStream(AStream: TStream): Boolean;
Duøng SendStream ñeå truyeàn taát caû thoâng tin trong AStream ñeán server socket. Haøm naøy
traû veà true neáu döõ lieäu ñaõ thöïc söï truyeàn ñi. Baïn khoâng caàn phaûi giaûi phoùng boä nhôù cho
AStream, windows socket seõ giaûi phoùng noù cho baïn.
function SendStreamThenDrop(AStream: TStream): Boolean;
SendStreamThenDrop laøm vieäc gioáng nhö SendStream, nhöng khi thi haønh xong leänh
naøy, noù seõ töï ñoäng terminates.
procedure Lock;
Goïi Lock tröôùc khi baét ñaàu ñoaïn maõ khoâng thread-safe. Baïn ñöøng duøng Lock khi thöïc
hieän ñoaïn maõ nhö ñoïc vaø ghi leân blocking connection bôûi vì neáu duøng seõ thöøa. Vôùi
ClientType laø ctBlocking, chöông trình ñaõ töï ñoäng taïm ngöng cho ñeán khi caùc thao taùc
I/O thöïc hieän xong.
procedure UnLock;
Goïi UnLock ôû cuoái ñoaïn maõ khoâng thread-safe maø tröôùc ñoù ñaõ duøng leänh Lock, khi aáy
caùc thread khaùc laïi tieáp tuïc thi haønh tieáp.
2.3 TserverSocket
TServerSocket ñieàu khieån server socket connections trong TCP/IP server.
TServerSocket seõ thieát laäp keát noái vôùi moät maùy khaùc khi maùy naøy ra yeâu caàu. Server
socket coù theå keát noái ñeán moät soá client vaø baïn coù theå giao tieáp vôùi caùc client naøy.
12
Kinh Doanh Nhaø Treân Maïng Client/Server – Thaày Thoaïi Nam – Sinh Vieân Leâ Tuaán
---------------------------------------------------------------------------------------------------------------------------
------------------
2.3.1 Truyeàn döõ lieäu ñeán moät Client
MyServer.Socket.Connections[2].SendText("this is a test");
TServerSocket
TServerWinSocket
TCustomWinSocket[array]
Caâu leänh ôû treân göûi döõ lieäu ñeán client thöù 3.
2.3.2 Ñoïc döõ lieäu töø moät client
Ñeå ñoïc döõ lieäu töø moät Client, baïn haõy ñoùn söï kieän OnClientRead. Baïn coù theå ghi leänh
trong event OnClientRead nhö sau:
procedure TChatForm.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Data : string;
begin
Data := Socket.Receive;
ShowMessage(‘Data sent : ‘ + Data);
end;
13