Tính năng Thread cho phép một chương trình xử lý đồng thời nhiều công việc. Chẳng hạn trong chương trình Go!Zilla Ver 3.2 Copyright 1997-98 Gizmonet, một lúc có thể download nhiều file từ cùng hoặc nhiều website khác nhau. Nó còn cho người dùng định độ ưu tiên cho từng thread.
Bạn có thể dùng BorlandC, Delphi, Cbuilder, Visual C . để viết nên những chương trình có tính năng thread. Nhưng dù bạn lập trình bằng ngôn ngữ nào đi chăng nữa, thì cũng phải sử dụng những hàm API của Microsoft cung cấp như CreateThread, SetThreadPriority . một cách trực tiếp hoặc gián tiếp.
130 trang |
Chia sẻ: luyenbuizn | Lượt xem: 1053 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Kinh doanh nhà trên mạng client/server, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Giôùi thieäu Thread trong Delphi
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.
ÖÙ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.
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 :
procedure TMyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
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.
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.
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;
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.
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;
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:
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:
Vieát maõ cho OnRead Event
Ñònh Address property ñeán Server address.
Ñònh Port laø giaù trò Port Property cuûa TServerSocket muoán keát noái.
Ñònh ClientType property ñeán ctNonBlocking.
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.
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);
Ñ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;
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.
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.
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.
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.
Ñ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;
Baïn coù theå bieát chính xaùc Client thöù maáy ñaõ göûi döõ lieäu ñeán server socket
Ñoaïn maõ sau ñaây seõ cho bieát client naøo ñaõ göûi döõ lieäu ñeán server socket:
procedure TChatForm.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Data : string;
Client, Total : integer;
begin
Total := MyServer.Socket.ActiveConnections;
for Client := 0 to Total do
if (MyServer.Socket.Connections[Client] = Socket then
Break;
Data := Socket.Receive;
ShowMessage(‘Data sent from client[‘ + IntToStr(Client) + ‘] : ‘ + Data);
end;
TServerWinSocket
Hai nhieäm vuï chính cuûa TServerWinSocket laø:
Laéng nghe yeâu caàu keát noái cuûa Client
TServerWinsocket luoân laéng nghe yeâu caàu keát noái töø client. Khi coù moät yeâu caàu keát noái göûi tôùi, TServerWinSocket seõ taïo ra moät socket control môùi (kieåu TServerWinSocket) ñeå lieân laïc vôùi client ñoù. socket control môùi naøy seõ ñöôïc theâm vaøo moät danh saùch ñöôïc moâ taû döôùi ñaây. Coâng vieäc naøy laø hoaøn toaøn töï ñoäng, ngöôøi laäp trình khoâng caàn quan taâm.
Quaûn lyù daõy caùc client socket ñaõ keát noái vôùi server socket
Ñeå lieân laïc vôùi moät client, baïn phaûi choïn moät socket trong danh saùch caùc client, sau ñoù baïn coù theå thöïc hieän caùc thao taùc ñoïc ghi cho client naøy.
Baïn coù theå duøng ActiveConnections property ñeå giao tieáp vôùi taát caû caùc client.
var
TotalClients, x : integer;
begin
TotalClients := MyServer.Socket.ActiveConnections;
for x := 0 to TotalClients do
MyServer.Socket.Connections[x].SendText("testing...");
end;
TServerClientWinSocket
TServerClientWinSocket gioáng nhö TClientWinSocket, caû hai ñeàu laø con cuûa TCustomWinSocket. Söï khaùc nhau giöõa TClientWinSocket vaø TServerClientWinSocket laø TClientWinSocket lieân laïc vôùi Server socket coøn TServerClientWinSocket lieân laïc vôùi moät client naøo ñoù.
Giôùi thieäu chöông trình
Noäi dung vaø yù nghóa chöông trình
Chöông trình ñöôïc xaây döïng treân moâ hình client/server cho pheùp nhieàu client cuøng truy caäp ñeán döõ lieäu naèm treân maùy server. Chöông trình ñöôïc duøng bôûi 3 nhoùm ñoái töôïng laø khaùch haøng, ngöôøi caäp nhaät döõ lieäu veà nhaø cöûa treân maùy server vaø ngöôøi quaûn lyù.
Neáu laø maùy server, treân maùy baïn phaûi coù taát caû caùc taäp tin döõ lieäu cuûa chöông trình thì môùi ñöôïc.
Neáu laø khaùch haøng hoaëc ngöôøi caäp nhaät döõ lieäu, baïn chæ caàn moät chöông trình thöïc thi laø ñuû. Coù theå baïn cuõng chaúng caàn phaûi cheùp chöông trình veà maùy mình laøm gì maø thöïc thi noù baèng caùch attach ñeán maùy server ñeå thöïc thi chöông trình.
Baát kyø ngöôøi duøng naøo muoán truy caäp ñeán chöông trình caàn phaûi ñöôïc ñaêng kyù moät username, password vaø quyeàn söû duïng.
Khi chöông trình ñöôïc thöïc thi, moät khung trao ñoåi hieän ra nhö sau:
* Neáu laø khaùch haøng, baïn phaûi nhaäp caùc tham soá sau:
+ HostName : Teân Computer cuûa maùy server.
+ User Name: Teân ñaêng kyù.
+ Password : Maät maõ ñaõ ñaêng kyù.
+ Level : Choïn Khaùch Haøng
Khi khaùch haøng yeâu caàu moät vieäc chaúng haïn ñaêng kyù thueâ moät caên nhaø, chöông trình (client) seõ göûi moät thoâng ñieäp thueâ nhaø ñeán maùy server. Maùy server seõ nhaän ñöôïc yeâu caàu naøy vaø taïo ra moät thread môùi ñeå giaûi quyeát coâng vieäc ñaêng kyù thueâ nhaø cho client. Taát nhieân vieäc tranh chaáp döõ lieäu phaûi ñöôïc ñeà caäp khi thöïc hieän thao taùc treân. Sau khi thöïc hieän xong, chöông trình server seõ göûi traû keát quaû veà cho maùy client.
Ngöôøi khaùch haøng coù theå thöïc hieän caùc coâng vieäc nhö sau:
+ Xem thoâng tin veà moät caên nhaø
+ Lieät keâ caùc caên nhaø thoûa moät soá ñieàu kieän do khaùch haøng ñònh nhö: Nhaø laø thueâ hay baùn; Nhaø noäi hay ngoaïi thaønh; Giaù tieàn nhoû nhaát vaø lôùn nhaát trong khoaûng naøo; Dieän tích nhaø nhoû nhaát vaø lôùn nhaát laø bao nhieâu.
+ Ñaêng kyù thueâ moät caên nhaø.
+ Ñaêng kyù mua moät caên nhaø.
* Neáu laø ngöôøi caäp nhaät töø ñieån döõ lieäu nhaø, baïn phaûi nhaäp caùc tham soá sau:
+ HostName : Teân Computer cuûa maùy server.
+ User Name: Teân ñaêng kyù.
+ Password : Maät maõ ñaõ ñaêng kyù.
+ Level : Choïn Ngöôøi Caäp Nhaät Thoâng Tin
Khi ngöôøi caäp nhaät döõ lieäu yeâu caàu moät vieäc chaúng haïn theâm moät thoâng tin nhaø môùi, chöông trình (client) seõ göûi moät thoâng ñieäp theâm thoâng tin nhaø môùi ñeán maùy server. Chöông trình server seõ nhaän ñöôïc yeâu caàu naøy vaø taïo ra moät thread ñeå giaûi quyeát coâng vieäc theâm thoâng tin nhaø môùi cho client. Taát nhieân vieäc tranh chaáp döõ lieäu phaûi ñöôïc ñeà caäp khi thöïc hieän thao taùc treân. Sau khi thöïc hieän xong, noù seõ göûi traû keát quaû veà cho maùy client.
Ngöôøi caäp nhaät döõ lieäu coù theå laøm caùc thao taùc sau:
+ Xem thoâng tin veà moät caên nhaø
+ Lieät keâ caùc caên nhaø thoûa moät soá ñieàu kieän do khaùch haøng ñònh nhö: Nhaø laø thueâ hay baùn; Nhaø noäi hay ngoaïi thaønh; Giaù tieàn nhoû nhaát vaø lôùn nhaát trong khoaûng naøo; Dieän tích nhaø nhoû nhaát vaø lôùn nhaát laø bao nhieâu.
+ Theâm thoâng tin veà moät caên nhaø môùi.
+ Söûa ñoåi thoâng tin moät caên nhaø ñaõ coù roài.
+ Bôùt thoâng tin veà moät caên nhaø khoûi töø ñieån.
* Neáu laø ngöôøi quaûn lyù (server), baïn phaûi nhaäp caùc tham soá sau:
+ User Name: Teân ñaêng kyù.
+ Password : Maät maõ ñaõ ñaêng kyù.
+ Level : Choïn Ngöôøi Quaûn Lyù
Caùc taäp tin döõ lieäu ñeàu naèm treân maùy server. Caùc client khoâng theå truy caäp tröïc tieáp ñeán döõ lieäu ñöôïc maø chæ göûi yeâu caàu ñeán cho server thöïc hieän.
Khi Server nhaän ñöôïc moät yeâu caàu naøo ñoù töø client, noù seõ taïo ra moät thread môùi ñeå giaûi quyeát cho vaán ñeà naøy. Neáu döõ lieäu bò thay ñoåi, chöông trình seõ phaûi caäp nhaät thoâng tin ngay treân maøn hình cuûa toaøn boä caùc maùy client.
Ngöôøi quaûn lyù coù theå laøm caùc thao taùc sau:
+ Xem thoâng tin veà moät caên nhaø
+ Lieät keâ caùc caên nhaø thoûa moät soá ñieàu kieän do khaùch haøng ñònh nhö: Nhaø laø thueâ hay baùn; Nhaø noäi hay ngoaïi thaønh; Giaù tieàn nhoû nhaát vaø lôùn nhaát trong khoaûng naøo; Dieän tích nhaø nhoû nhaát vaø lôùn nhaát laø bao nhieâu.
+ Theâm thoâng tin veà moät caên nhaø môùi.
+ Söûa ñoåi thoâng tin moät caên nhaø ñaõ coù roài.
+ Bôùt thoâng tin veà moät caên nhaø khoûi töø ñieån.
+ Thoáng keâ caùc caên nhaø ñaõ cho thueâ. Chöông trình lieät keâ danh saùch caùc nhaø ñaõ cho thueâ keøm theo moïi thoâng tin veà caùc nhaø ñaõ thueâ naøy.
+ Ngöôøi quaûn lyù coù theå xem nhaø naøo ñaõ heát haïn cho thueâ ñeå ñöa nhaø naøy trôû veà danh saùch nhaø coù theå cho thueâ.
+ Thoáng keâ caùc caên nhaø ñaõ baùn. Ngöôøi quaûn lyù coù theå xem danh saùch taát caû caùc nhaø ñaõ baùn vaø caû moïi thoâng tin veà noù nöõa.
YÙ nghóa chính trong chöông trình naøy laø nhaèm giaûi quyeát ba vaán ñeà chính sau ñaây:
Duøng thread ñeå phaân chia thôøi gian thöïc hieän coâng vieäc cuûa töøng client.
Ví duï moät client naøo ñoù yeâu caàu ñeán server moät taùc vuï maø ñoøi hoûi moät thôøi gian laâu môùi giaûi quyeát xong. Neáu khoâng phaân chia thôøi gian thì trong luùc thöïc hieän taùc vuï naøy cho client ñoù, caùc client khaùc khoâng theå ra leänh ñöôïc cho maùy server, chöông trình chaïy khoâng toát.
(2) Giaûi quyeát tranh chaáp ñeå baûo toaøn döõ lieäu. Neáu cuøng moät luùc, hai hay nhieàu client cuøng ñoøi quyeàn söûa chöõa thoâng tin veà nhaø cöûa, neáu khoâng tính ñeán vieäc naøy, döõ lieäu coù nguy cô bò hö hoûng.
Ñaây laø moät chöông trình öùng duïng thöïc söï vì noù coù haàu heát caùc tính naêng cuûa moät chöông trình kinh doanh nhaø ñaát treân maïng client/server.
Phaàn tieáp theo ta seõ noùi chi tieát veà toå chöùc döõ lieäu cuûa chöông trình, thoâng tin veà nhaø cöûa, caùch giao tieáp giöõa caùc maùy, tranh chaáp döõ lieäu, phaân chia CPU cho client…
Caùc vaán ñeà chính caàn giaûi quyeát
Toå chöùc döõ lieäu trong chöông trình
Thoâng tin veà nhaø cöûa goàm coù:
THomeInfo = packed record
TenNha : string[30]; // Teân nhaø
CapNha : byte; // Caáp nhaø
ChieuDai : real // Chieàu daøi nhaø
ChieuRong : real; // Chieàu roäng nhaø
TangLau : byte; // Soá laàu
PhongKhach : byte; // Soá phoøng khaùch
PhongNgu : byte; // Soá phoøng nguû
PhongTam : byte; // Soá phoøng taém
DiaChi, // Ñòa chæ nhaø
Duong, // Teân ñöôøng
ThanhPho : string[30]; // Teân thaønh phoá
Quan : string[30]; // Teân quaän
NhaChoThue : boolean; // Coù phaûi nhaø cho thueâ
GiaMoiThang : real; // Giaù tieàn thueâ moãi thaùng
NhaBan : boolean; // Coù phaûi nhaø muoán baùn
TriGia : real; // Giaù tieàn baùn
NhaNgoaiThanh : boolean; // Nha ngoaïi oâ hay noäi thaønh
CoNuocMay : Boolean; // Nhaø coù nöôùc maùy khoâng
NhaCoHeThongNuocNong : Boolean; // Nhaø heä thoáng nöôùc noùng
NhaCoHoBoi : boolean; // Nhaø coù hoà bôi khoâng
NhaCoNuocGieng : boolean; // Nhaø coù nuôùc gieáng
NhaTrongHem : boolean; // Nhaø trong heûm hay khoâng
ChieuRongHem : real; // Chieàu roäng heûm
VaoHemBaosau : real; // Chieàu saâu heûm
NamXayDung : TDateTime; // Naêm xaây döïng nhaø
TinhTrangNha : Byte; // Tình traïng nhaø: Raát Toát= 0,Toát = 1
// Trung bình = 2, Keùm = 3
TrangTriNoiThat : Byte; // Sang troïng = 0, Toát = 1
// Trung bình = 2, Keùm = 3
NhaCoVuon : boolean; // Nhaø coù vöôøn khoâng
ChieuRongVuon : real; // Chieàu roäng vöôøn tính theo m
HuongNha : Byte; // Höôùng nhaø (Ñoâng = 0, Taây = 1,
ChuQuyen : Byte; // Nam = 2, Baéc = 3, Ñoâng Baéc = 4,
// Ñoâng Nam = 5, Taây Baéc = 6
// Taây Nam = 7
DienTich : real; // Dieän tích nhaø (m vuoâng)
rent_roi : boolean; // Nhaø ñaõ thueâ roài
sell_roi : boolean; // Nhaø ñaõ baùn roài
NgayDauThue : TDateTime; // Ngaøy baét ñaàu thueâ nhaø
NgayCuoiThue : TDateTime; // Ngaøy keát thuùc thueâ nhaø
end;
Caùc taäp tin döõ lieäu trong chöông trình goàm coù:
ltdata.dic : file of THomeInfo, chöùa thoâng tin nhaø cöûa
ltidx.dic : file of longint, index file
ltrent.dic : file of longint, löu index caùc nhaø ñaõ cho thueâ
ltsell.dic : file of longint, löu index caùc nhaø ñaõ baùn
Keát noái cho client
Ta keát noái cho moät client baèng ñoaïn maõ sau:
with ClientSocket do
begin
Host := DomainName;
Active := True;
end;
Tuøy vaøo quyeàn ñaõ ñaêng kyù cuûa ngöôøi söû duïng, chöông trình seõ hieän leân khung trao ñoåi töông öùng. Chaúng haïn, neáu quyeàn söû duïng laø khaùch haøng, chöông trình chæ hieän ra caùc chöùc naêng cho pheùp hoï tìm kieám, ñaêng kyù thueâ mua nhaø… nhöng khoâng hieän ra caùc chöùc naêng söûa ñoåi döõ lieäu.
Huûy keát noái cho client
Ta huûy keát noái cho moät client baèng ñoaïn maõ sau:
ClientSocket.Close;
Tranh chaáp döõ lieäu
Ñeå traùnh döõ lieäu coù theå bò hö hoûng khi nhieàu client cuøng söûa ñoåi döõ lieäu naèm treân maùy server, chöông trình ñaõ giaûi quyeát ñöôïïc vaán ñeà naøy baèng caùch söû duïng caùc haøm API cuûa windows, xin xem phaàn 1.3 cuûa baøi baùo caùo naøy.
Duøng thread ñeå phaân chia CPU cho caùc thao taùc cuûa client
Ñeå trong cuøng moät thôøi gian, nhieàu client coù theå truy caäp ñeán cuøng moät döõ lieäu naèm treân maùy server, ta duøng thread. Xin xem phaàn 1 cuûa baøi baùo caùo naøy ñeå bieát caùch duøng thread.
Baïn cuõng coù theå xem Ñoà AÙn Moân Hoïc – Thread trong Delphi cuûa Leâ Tuaán, KS2K6
ñeå hieåu roõ hôn veà thread, trong naøy cuõng coù source minh hoïa cho thread.
Caùc chöùc naêng cho ngöôøi quaûn lyù
Ñaây laø khung trao ñoåi chính cuûa chöông trình:
Chöông trình cung caáp cho baïn haàu heát caùc tính naêng cuûa moät trình quaûn lyù döõ lieäu thoâng thöôøng.
Caùc thao taùc treân döõ lieäu thöïc chaát ñeàu do chöông trình server ñaûm nhaän.
Tìm kieám moät nhaø
Toaøn boä nhaø coù trong töø ñieån (khoâng keå nhaø ñaõ thueâ hay baùn) seõ ñöôïc lieät keâ trong moät listbox. Danh saùch nhaø naøy ñöôïc saép xeáp theo alphabet theo teân gôïi nhôù cuûa nhaø.
Chöông trình cho baïn moät oâ soaïn thaûo ñeå goõ teân nhaø caàn tìm vaøo, khi goõ ñeán ñaâu, chöông trình töï ñoäng nhaûy ñeán teân nhaø gaàn gioáng vôùi teân baïn goõ vaøo nhaát.
Giaûi thuaät laäp trình cho Tìm kieám nhaø
OÂ soaïn thaûo TEdit ñoùn söï kieän OnChange, moãi khi coù söï thay ñoåi, chöông trình seõ taïo moät thread teân THomeSearchTextThread.
procedure THomeSearchTextThread.Execute;
begin
EnterCriticalSection(CritSect);
Synchronize(DoThread);
LeaveCriticalSection(CritSect);
end;
Haøm DoThread naøy chuû yeáu goïi haøm HomeSearch ñöôïc moâ taû döôùi ñaây:
function HomeSearch (TeânNhaø : string; var found : boolean) : longint;
Haøm naøy tìm kieám trong danh saùch nhaø coù TeânNhaø nhö tham soá ñöa vaøo khoâng?
Input :
TeânNhaø : Teân nhaø caàn tìm
Output:
found = True, tìm thaáy nhaø. Giaù trò haøm traû veà laø vò trí index cuûa nhaø vöøa tìm ñöôïc.
found = False, khoâng tìm thaáy nhaø. Giaù trò traû veà laø vò trí index coù teân nhaø gaàn gioáng nhaát vôùi teân nhaø caàn tìm.
Laáy thoâng tin cuûa moät nhaø
Moãi khi ngöôøi duøng nhaán chuoät vaøo moät nhaø trong danh saùch nhaø, chöông trình seõ sinh ra moät thread teân THomeGetDataThread ñeå laáy moïi thoâng tin veà nhaø.
procedure THomeGetDataThread.Execute;
begin
EnterCriticalSection(CritSect);
Synchronize(DoThread);
LeaveCriticalSection(CritSect);
end;
Haøm DoThread naøy chuû yeáu seõ goïi ha
Các file đính kèm theo tài liệu này:
- dt100799.doc