Siêu thị PDFTải ngay đi em, trời tối mất

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
PREMIUM
Số trang
130
Kích thước
812.9 KB
Định dạng
PDF
Lượt xem
1732

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

Tải ngay đi em, còn do dự, trời tối mất!