Tải bản đầy đủ (.doc) (130 trang)

THREAD trong DELPHI.doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (812.87 KB, 130 trang )

Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
1 GIỚI THIỆU THREAD TRONG DELPHI................................................................3
1.1 THREAD LÀ GÌ?....................................................................................................................................3
1.2 ỨNG DỤNG CỦA THREAD........................................................................................................................3
1.3 SỬ DỤNG TTHREAD TRONG DELPHI..........................................................................................................4
1.3.1 Các method đáng chú ý khi viết Thread..................................................................................5
1.3.2 Các property đáng chú ý khi viết Thread................................................................................6
1.3.3 Tranh chấp dữ liệu khi viết multi-thread.................................................................................7
1.3.4 Sử Dụng Critical Section trong chương trình............................................................................9
2 GIAO TIẾP GIỮA CÁC MÁY MÔ HÌNH CLIENT/SERVER ..............................9
2.1 TCLIENTSOCKET................................................................................................................................10
2.1.1 Ghi dữ liệu đến server............................................................................................................10
2.1.2 Đọc dữ liệu từ server..............................................................................................................11
2.2 TCLIENTWINSOCKET..........................................................................................................................11
2.3 TSERVERSOCKET.................................................................................................................................12
2.3.1 Truyền dữ liệu đến một Client...............................................................................................13
2.3.2 Đọc dữ liệu từ một client........................................................................................................13
2.3.3 Bạn có thể biết chính xác Client thứ mấy đã gửi dữ liệu đến server socket.........................14
2.4 TSERVERWINSOCKET.........................................................................................................................14
2.4.1 Lắng nghe yêu cầu kết nối của Client...................................................................................14
2.4.2 Quản lý dãy các client socket đã kết nối với server socket...................................................15
2.5 TSERVERCLIENTWINSOCKET................................................................................................................15
3 GIỚI THIỆU CHƯƠNG TRÌNH ...............................................................................16
3.1 NỘI DUNG VÀ Ý NGHĨA CHƯƠNG TRÌNH.....................................................................................................16
3.2 CÁC VẤN ĐỀ CHÍNH CẦN GIẢI QUYẾT.......................................................................................................20
3.2.1 Tổ chức dữ liệu trong chương trình........................................................................................20
3.2.2 Kết nối cho client...................................................................................................................21
3.2.3 Hủy kết nối cho client............................................................................................................22
3.2.4 Tranh chấp dữ liệu.................................................................................................................22


3.2.5 Dùng thread để phân chia CPU cho các thao tác của client..................................................22
3.3 CÁC CHỨC NĂNG CHO NGƯỜI QUẢN LÝ.....................................................................................................23
3.3.1 Tìm kiếm một nhà..................................................................................................................24
3.3.2 Lấy thông tin của một nhà.....................................................................................................25
3.3.3 Thêm thông tin một nhà mới..................................................................................................26
3.3.4 Xóa thông tin một nhà............................................................................................................28
3.3.5 Cập nhật thông tin một nhà....................................................................................................29
3.3.6 Thống kê số nhà đã cho thuê.................................................................................................31
3.3.6.1 Đếm số nhà đã cho thuê.................................................................................................31
3.3.6.2 Đưa một nhà đã hết hạn cho thuê về danh sách các nhà có thể cho thuê......................32
3.3.7 Thống kê số nhà đã bán.........................................................................................................36
3.3.7.1 Đếm số nhà đã bán.........................................................................................................36
3.4 CÁC CHỨC NĂNG CHO NGƯỜI CẬP NHẬT THÔNG TIN NHÀ..............................................................................37
3.4.1 Tìm kiếm một nhà..................................................................................................................38
3.4.2 Lấy thông tin của một nhà.....................................................................................................38
3.4.3 Cập nhật thông tin một nhà....................................................................................................38
3.4.4 Thêm thông tin một nhà mới..................................................................................................39
3.4.5 Xóa thông tin một nhà............................................................................................................39
1
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
3.5 CÁC CHỨC NĂNG CHO MỘT KHÁCH HÀNG..................................................................................................40
3.5.1 Lấy thông tin về một nhà.......................................................................................................40
3.5.2 Tìm kiếm một nhà..................................................................................................................40
3.5.3 Tìm kiếm theo điều kiện........................................................................................................41
3.5.4 Đăng ký thuê nhàø...................................................................................................................46
3.5.5 Đăng ký mua nhà...................................................................................................................50
3.6 MÃ CHƯƠNG TRÌNH KINH DOANH NHÀ ĐẤT TRÊN MẠ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 Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
1 Giới thiệu Thread trong Delphi
1.1 Thread là gì?
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.
1.2 Ứng dụng của Thread
Thread được sử dụng rất nhiều trên các lónh vực như đồ họa (xử lý nhiều hình ảnh một
lúc), trong trò chơi (làm nền hoặc mỗi nhân vật trong trò chơi là một thread), truyền tin
(tín hiệu xuất ra được xử lý tức thời) ...
Thread làm cho chương trình trở nên đơn giản, dễ hiểu khi ta phải viết những chương
trình đòi hỏi xử lý đồng thời nhiều công việc.

3
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3 Sử dụng TThread trong Delphi
Sử dụng TThread của Delphi để viết nên những chương trình có tính năng Thread thì
rất dễ. Cấu trúc cơ bản một unit có sử dụ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
{ phần mã có tính năng Thread đặt ở đây}
end;
end.
Một điều quan trọng cần lưu ý khi viết Thread là những đối tượng hay hàm nào nằm
trong thư viện VCL của Delphi phải gọi bằng phương pháp Synchronize.
Ví dụ :
Synchronize(UpdateCaption);
Với UpdateCaption :

4
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
procedure TMyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
1.3.1 Các method đáng chú ý khi viết Thread
* Constructor Create(CreateSuspended: Boolean);
Constructor Create để khởi tạo một đối tượng Thread.
Nếu CreateSuspended = False, Execute được gọi ngay lập tức
Nều CreateSuspended = True, Execute không được gọi cho đến khi Resume được gọi.
* Destructor Destroy; override;
Destructor Destroy hủy đối tượng thread và giải phóng bộ nhớ nó chiếm giữ.
* Procedure DoTerminate; virtual;
DoTerminate làm cho thread gọi sự kiện OnTerminate.
* Procedure Execute; virtual; abstract;
Procedure Execute là một method abstract phải được override bởi lớp con. Nó chứa mã
khi bắt đầu Thread.
* Procedure Resume;
Procedure Resume tiếp tục gọi một thread tạm ngưng.
* Procedure Suspend;
Procedure Suspend tạm ngưng một thread đang chạy.
* Procedure Synchronize(Method: TThreadMethod);
Procedure Synchronize thực hiện method dùng thư viện VCL.
* Procedure Terminate;
Procedure Terminate ra hiệu cho thread dừng bằng cách gán property Terminated là
True.
5

Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3.2 Các property đáng chú ý khi viết Thread
* property FreeOnTerminate: Boolean;
property FreeOnTerminate đònh cho đối tượng thread tự động giải phóng nhớ nếu
FreeOnTerminate = True.
* property Handle: Thandle;
property Handle là handle của thread.
* property Priority: TThreadPriority;
property Priority xác đònh độ ưu tiên giữa các thread khác trong tiến trình.
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
tpTimeCritical);
+ tpIdle : Chỉ thực hiện khi hệ thống Windows rảnh rỗi, nó không ngắt ngang đối
tượng thread khác để chạy.
+ tpLowest : Mức độ ưu tiên dưới 2 điểm so với bình thường.
+ tpLower : Mức độ ưu tiên dưới 1 điểm so với bình thường.
+ tpNormal: Mức độ ưu tiên bình thường.
+ tpHigher : Mức độ ưu tiên trên 1 điểm so với bình thường.
+ tpHigher : Mức độ ưu tiên trên 1 điểm so với bình thường.
+ tpHighest : Mức độ ưu tiên trên 2 điểm so với bình thường.
+ tpTimeCritical : Mức độ ưu tiên cao nhất.
* property Suspended: Boolean;
property Suspended chỉ đònh thread tạm ngưng nếu bằng true.
* property Terminated: Boolean;
property Terminated chỉ đònh rằng thread yêu cầu dừng nếu bằng true.
* property ThreadID: THandle;
property ThreadID nhận biết duy nhất cho đối tượng thread xuyên suốt hệ thống.
ThreadID thì khác property Handle.
6

Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3.3 Tranh chấp dữ liệu khi viết multi-thread
Khi bạn viết một chương trình multi-threaded, có trường hợp 2 thread cùng truy cập đến
một vùng dữ liệu, chẳng hạn như là một file, điều này có thể làm cho file bò hư hoặc có
thể máy của bạn sẽ bò treo. Để giải quyết vấn đề này, bạn sẽ cho các thread khác
không thể truy cập đến vùng nhớ mà thread hiện hành đang sửa đổi dữ liệu cho đến khi
dữ liệu được xử lý xong.
Critical sections được thiết kế mà một phần resource được dùng riêng biệt và tách rời
khỏi các tiến trình khác. Bạn hãy tưởng tượng rằng có hai người cùng đi song song trên
một con đường, bỗng nhiên xuất hiện một cây cầu hẹp, chỉ đủ để một người đi qua.
Bình thường một người sẽ nhường đường cho người kia đi trước. Khi mà một người qua
cầu rồi thì người kia sẽ tiếp tục đi qua cầu và họ lại tiếp tục đi song song với nhau.
Critical sections cũng tương tự như việc đi qua cầu. Bạn hãy nhìn hình ở trên đây, hai
thread (mũi tên màu cyan) đang chạy trên tiến trình đơn (vùng màu đen), khi các thread
chạy đến critical sections (vùng màu xanh dương), một thread sẽ nhường cho thread kia
đi qua. Trong thực tế, một thread sẽ đi đến critical sections, nó có thể tạo ra một cờ ra
hiệu cho các thread khác không được liên lạc với data.
Để thực hiện critacal sections trong mã chương trình viết bằng Borland Delphi, bạn hãy
làm dấu khối trên mỗi thread mà truy cập đến vùng nhớ chung bằng các hàm
EnterCriticalSection và LeaveCriticalSection. Điều đầu tiên, trong chương trình,
bạn phải đònh nghóa một critical trên bộ nhớ. Điều này thực hiện được bằng cách gọi
hàm InitializeCriticalSection. Hàm này được khai báo như sau:
procedure InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection); stdcall;
7
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
InitializeCriticalSection lấy một tham số kiểu TRTLCriticalSection, mà trường của nó

lưu trữ thông tin về critical section. Bạn không cần quan tâm về cấu trúc của nó, bởi bì
chẳng cần thao tác trên đó. Hãy khai báo một biến toàn cục kiểu TRTLCriticalSection.
Sau khi làm critical xong, hãy hủy nó bằng hàm DeleteCriticalSection. Cũng giống
như InitializeCriticalSection, hàm này có một tham số kiểu TRTLCriticalSeciont.
Trong trường hợp này, hai tham số biến trong DeleteCriticalSection và
InitializeCriticalSection là một. Trong chương trình bạn hãy gõ vào các lệnh sau:
unit myCritical;
Interface
var
CritSect : TRTLCriticalSection;

Implementation

initialization
InitializeCriticalSection(CritSect);
finalization
DeleteCriticalSection(CritSect);
end.
8
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
1.3.4 Sử Dụng Critical Section trong chương trình
Đặt critical section để dùng trong thread thì rất dễ. Bạn chỉ cần xem một đoạn mã ví dụ
dưới đây thì sẽ biết ngay:

procedure TMyThread.ChangeData;
begin
...


EnterCriticalSection(CritSect);
...Các thao tác sửa đổi dữ liệu dùng chung đặt ở đây
LeaveCriticalSection(CritSect);
end;
2 Giao tiếp giữa các máy mô hình Client/Server
Trong đề tài thực tập này, ta dùng ngôn ngữ lập trình Delphi để giao tiếp giữa các máy
qua mô hình Client/Server, cụ thể là sử dụng các control như : TClientSocket,
ClientWinSocket, TServerSocket, TServerWinSocket. Hình dưới đây liệt kê các lớp
của socket control:
9
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
2.1 TClientSocket
TClientSocket được dùng để kết nối đến một Server Socket. Để sử dụng control này,
bạn nên làm các thao tác sau đây:
(1) Viết mã cho OnRead Event
(2) Đònh Address property đến Server address.
(3) Đònh Port là giá trò Port Property của TServerSocket muốn kết nối.
(4) Đònh ClientType property đến ctNonBlocking.
(5) Gọi Open method để kết nối đến remote Server.
Ta nói thêm về ClientType property.
Nếu ClientType = ctNonBlocking, khi chương trình đọc hay ghi dữ liệu đến socket,
chương trình sẽ thực hiện lệnh I/O này rồi tiếp tục thực hiện chương trình ngay cả thao
tác I/O này chưa thực hiện xong.
Nếu ClientType = ctBlocking, chương trình sẽ tạm không chạy tiếp mà chờ cho đến khi
thao tác I/O thực hiện xong.
Trong chương trình này, ta sẽ cho ClientType = ctNonBlocking.
2.1.1 Ghi dữ liệu đến server
Khi bạn muốn gửi dữ liệu đi, dùng lệnh tương tự như sau:

MyClientSocket.Socket.SendText("this is a test");

TClientSocket TClientWinSocket
Hoặc dùng lệnh:
BytesWritten := MyClientSocket.Socket.SendBuf(buf, count);
10
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
2.1.2 Đọc dữ liệu từ server
Bạn có thể đọc dữ liệu từ Server bằng cách dùng lệnh ReceiveText hay ReceiveBuf đặt
trong OnRead Event.
procedure TChatForm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
StringData := Socket.ReceiveText;
end;
2.2 TClientWinSocket
Ta sẽ mô tả một số hàm quan trọng trong TClientWinSocket.
function ReceiveBuf(var Buf; Count: Integer): Integer;
ReceiveBuf đọc dữ liệu từ server socket, số byte đọc do người dùng đònh. Dữ liệu đọc
được sẽ chứa trong Buf, giá trò trả về là số byte đã thực sự đọc được.
function ReceiveText: string;
Dùng ReceiveText để đọc một chuỗi từ server socket.
function SendBuf(var Buf; Count: Integer): Integer;
Dùng SendBuf để truyền dữ liệu trong Buf đến server socket. Hàm này trả về số byte
thực sự đã truyền.
procedure SendText(const S: string);
Dùng SendText để truyền một chuỗi đến server socket.
11

Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
function SendStream(AStream: TStream): Boolean;
Dùng SendStream để truyền tất cả thông tin trong AStream đến server socket. Hàm này
trả về true nếu dữ liệu đã thực sự truyền đi. Bạn không cần phải giải phóng bộ nhớ cho
AStream, windows socket sẽ giải phóng nó cho bạn.
function SendStreamThenDrop(AStream: TStream): Boolean;
SendStreamThenDrop làm việc giống như SendStream, nhưng khi thi hành xong lệnh
này, nó sẽ tự động terminates.
procedure Lock;
Gọi Lock trước khi bắt đầu đoạn mã không thread-safe. Bạn đừng dùng Lock khi thực
hiện đoạn mã như đọc và ghi lên blocking connection bởi vì nếu dùng sẽ thừa. Với
ClientType là ctBlocking, chương trình đã tự động tạm ngưng cho đến khi các thao tác
I/O thực hiện xong.
procedure UnLock;
Gọi UnLock ở cuối đoạn mã không thread-safe mà trước đó đã dùng lệnh Lock, khi ấy
các thread khác lại tiếp tục thi hành tiếp.
2.3 TserverSocket
TServerSocket điều khiển server socket connections trong TCP/IP server.
TServerSocket sẽ thiết lập kết nối với một máy khác khi máy này ra yêu cầu. Server
socket có thể kết nối đến một số client và bạn có thể giao tiếp với các client này.
12
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
2.3.1 Truyền dữ liệu đến một Client
MyServer.Socket.Connections[2].SendText("this is a test");
TServerSocket
TServerWinSocket

TCustomWinSocket[array]
Câu lệnh ở trên gửi dữ liệu đến client thứ 3.
2.3.2 Đọc dữ liệu từ một client
Để đọc dữ liệu từ một Client, bạn hãy đón sự kiện OnClientRead. Bạn có thể ghi lệ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
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
2.3.3 Bạn có thể biết chính xác Client thứ mấy đã gửi dữ liệu đến server socket
Đoạn mã sau đây sẽ cho biết client nào đã gửi dữ liệu đế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;
2.4 TServerWinSocket
Hai nhiệm vụ chính của TServerWinSocket là:
2.4.1 Lắng nghe yêu cầu kết nối của Client
TServerWinsocket luôn lắng nghe yêu cầu kết nối từ client. Khi có một yêu cầu kết
nối gửi tới, TServerWinSocket sẽ tạo ra một socket control mới (kiểu
TServerWinSocket) để liên lạc với client đó. socket control mới này sẽ được thêm vào
một danh sách được mô tả dưới đây. Công việc này là hoàn toàn tự động, người lập
trình không cần quan tâm.
14
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
2.4.2 Quản lý dãy các client socket đã kết nối với server socket
Để liên lạc với một client, bạn phải chọn một socket trong danh sách các client, sau đó
bạn có thể thực hiện các thao tác đọc ghi cho client này.
Bạn có thể dùng ActiveConnections property để giao tiếp với tất cả các client.
var
TotalClients, x : integer;
begin
TotalClients := MyServer.Socket.ActiveConnections;
for x := 0 to TotalClients do
MyServer.Socket.Connections[x].SendText("testing...");
end;
2.5 TServerClientWinSocket
TServerClientWinSocket giống như TClientWinSocket, cả hai đều là con của
TCustomWinSocket. Sự khác nhau giữa TClientWinSocket và TServerClientWinSocket
là TClientWinSocket liên lạc với Server socket còn TServerClientWinSocket liên lạc

với một client nào đó.
15
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
3 Giới thiệu chương trình
3.1 Nội dung và ý nghóa chương trình
Chương trình được xây dựng trên mô hình client/server cho phép nhiều client cùng truy
cập đến dữ liệu nằm trên máy server. Chương trình được dùng bởi 3 nhóm đối tượng là
khách hàng, người cập nhật dữ liệu về nhà cửa trên máy server và người quản lý.
Nếu là máy server, trên máy bạn phải có tất cả các tập tin dữ liệu của chương trình thì
mới được.
Nếu là khách hàng hoặc người cập nhật dữ liệu, bạn chỉ cần một chương trình thực thi
là đủ. Có thể bạn cũng chẳng cần phải chép chương trình về máy mình làm gì mà thực
thi nó bằng cách attach đến máy server để thực thi chương trình.
Bất kỳ người dùng nào muốn truy cập đến chương trình cần phải được đăng ký một
username, password và quyền sử dụng.
Khi chương trình được thực thi, một khung trao đổi hiện ra như sau:
16
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
* Nếu là khách hàng, bạn phải nhập các tham số sau:
+ HostName : Tên Computer của máy server.
+ User Name: Tên đăng ký.
+ Password : Mật mã đã đăng ký.
+ Level : Chọn Khách Hàng
Khi khách hàng yêu cầu một việc chẳng hạn đăng ký thuê một căn nhà, chương trình
(client) sẽ gửi một thông điệp thuê nhà đến máy server. Máy server sẽ nhận được yêu
cầu này và tạo ra một thread mới để giải quyết công việc đăng ký thuê nhà cho client.

Tất nhiên việc tranh chấp dữ liệu phải được đề cập khi thực hiện thao tác trên. Sau khi
thực hiện xong, chương trình server sẽ gửi trả kết quả về cho máy client.
Người khách hàng có thể thực hiện các công việc như sau:
+ Xem thông tin về một căn nhà
+ Liệt kê các căn nhà thỏa một số điều kiện do khách hàng đònh như: Nhà là thuê hay
bán; Nhà nội hay ngoại thành; Giá tiền nhỏ nhất và lớn nhất trong khoảng nào; Diện
tích nhà nhỏ nhất và lớn nhất là bao nhiêu.
+ Đăng ký thuê một căn nhà.
+ Đăng ký mua một căn nhà.
* Nếu là người cập nhật từ điển dữ liệu nhà, bạn phải nhập các tham số sau:
+ HostName : Tên Computer của máy server.
+ User Name: Tên đăng ký.
+ Password : Mật mã đã đăng ký.
+ Level : Chọn Người Cập Nhật Thông Tin
Khi người cập nhật dữ liệu yêu cầu một việc chẳng hạn thêm một thông tin nhà mới,
chương trình (client) sẽ gửi một thông điệp thêm thông tin nhà mới đến máy server.
Chương trình server sẽ nhận được yêu cầu này và tạo ra một thread để giải quyết công
việc thêm thông tin nhà mới cho client. Tất nhiên việc tranh chấp dữ liệu phải được đề
17
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
cập khi thực hiện thao tác trên. Sau khi thực hiện xong, nó sẽ gửi trả kết quả về cho
máy client.
Người cập nhật dữ liệu có thể làm các thao tác sau:
+ Xem thông tin về một căn nhà
+ Liệt kê các căn nhà thỏa một số điều kiện do khách hàng đònh như: Nhà là thuê hay
bán; Nhà nội hay ngoại thành; Giá tiền nhỏ nhất và lớn nhất trong khoảng nào; Diện
tích nhà nhỏ nhất và lớn nhất là bao nhiêu.
+ Thêm thông tin về một căn nhà mới.

+ Sửa đổi thông tin một căn nhà đã có rồi.
+ Bớt thông tin về một căn nhà khỏi từ điển.
* Nếu là người quản lý (server), bạn phải nhập các tham số sau:
+ User Name: Tên đăng ký.
+ Password : Mật mã đã đăng ký.
+ Level : Chọn Người Quản Lý
Các tập tin dữ liệu đều nằm trên máy server. Các client không thể truy cập trực tiếp
đến dữ liệu được mà chỉ gửi yêu cầu đến cho server thực hiện.
Khi Server nhận được một yêu cầu nào đó từ client, nó sẽ tạo ra một thread mới để giải
quyết cho vấn đề này. Nếu dữ liệu bò thay đổi, chương trình sẽ phải cập nhật thông tin
ngay trên màn hình của toàn bộ các máy client.
18
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
Người quản lý có thể làm các thao tác sau:
+ Xem thông tin về một căn nhà
+ Liệt kê các căn nhà thỏa một số điều kiện do khách hàng đònh như: Nhà là thuê hay
bán; Nhà nội hay ngoại thành; Giá tiền nhỏ nhất và lớn nhất trong khoảng nào; Diện
tích nhà nhỏ nhất và lớn nhất là bao nhiêu.
+ Thêm thông tin về một căn nhà mới.
+ Sửa đổi thông tin một căn nhà đã có rồi.
+ Bớt thông tin về một căn nhà khỏi từ điển.
+ Thống kê các căn nhà đã cho thuê. Chương trình liệt kê danh sách các nhà đã cho
thuê kèm theo mọi thông tin về các nhà đã thuê này.
+ Người quản lý có thể xem nhà nào đã hết hạn cho thuê để đưa nhà này trở về danh
sách nhà có thể cho thuê.
+ Thống kê các căn nhà đã bán. Người quản lý có thể xem danh sách tất cả các nhà đã
bán và cả mọi thông tin về nó nữa.
Ý nghóa chính trong chương trình này là nhằm giải quyết ba vấn đề chính sau đây:

(1) Dùng thread để phân chia thời gian thực hiện công việc của từng client.
Ví dụ một client nào đó yêu cầu đến server một tác vụ mà đòi hỏi một thời gian lâu
mới giải quyết xong. Nếu không phân chia thời gian thì trong lúc thực hiện tác vụ này
cho client đó, các client khác không thể ra lệnh được cho máy server, chương trình chạy
không tốt.
(2) Giải quyết tranh chấp để bảo toàn dữ liệu. Nếu cùng một lúc, hai hay nhiều client
cùng đòi quyền sửa chữa thông tin về nhà cửa, nếu không tính đến việc này, dữ liệu có
nguy cơ bò hư hỏng.
19
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
(3) Đây là một chương trình ứng dụng thực sự vì nó có hầu hết các tính năng của một
chương trình kinh doanh nhà đất trên mạng client/server.
Phần tiếp theo ta sẽ nói chi tiết về tổ chức dữ liệu của chương trình, thông tin về nhà
cửa, cách giao tiếp giữa các máy, tranh chấp dữ liệu, phân chia CPU cho client…
3.2 Các vấn đề chính cần giải quyết
3.2.1 Tổ chức dữ liệu trong chương trình
Thông tin về nhà cửa gồm có:
THomeInfo = packed record
TenNha : string[30]; // Tên nhà
CapNha : byte; // Cấp nhà
ChieuDai : real // Chiều dài nhà
ChieuRong : real; // Chiều rộng nhà
TangLau : byte; // Số lầu
PhongKhach : byte; // Số phòng khách
PhongNgu : byte; // Số phòng ngủ
PhongTam : byte; // Số phòng tắm
DiaChi, // Đòa chỉ nhà
Duong, // Tên đường

ThanhPho : string[30]; // Tên thành phố
Quan : string[30]; // Tên quận
NhaChoThue : boolean; // Có phải nhà cho thuê
GiaMoiThang : real; // Giá tiền thuê mỗi tháng
NhaBan : boolean; // Có phải nhà muốn bán
TriGia : real; // Giá tiền bán
NhaNgoaiThanh : boolean; // Nha ngoại ô hay nội thành
CoNuocMay : Boolean; // Nhà có nước máy không
NhaCoHeThongNuocNong : Boolean; // Nhà hệ thống nước nóng
NhaCoHoBoi : boolean; // Nhà có hồ bơi không
NhaCoNuocGieng : boolean; // Nhà có nùc giếng
NhaTrongHem : boolean; // Nhà trong hẻm hay không
ChieuRongHem : real; // Chiều rộng hẻm
VaoHemBaosau : real; // Chiều sâu hẻm
NamXayDung : TDateTime; // Năm xây dựng nhà
20
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
TinhTrangNha : Byte; // Tình trạng nhà: Rất Tốt= 0,Tốt = 1
// Trung bình = 2, Kém = 3
TrangTriNoiThat : Byte; // Sang trọng = 0, Tốt = 1
// Trung bình = 2, Kém = 3
NhaCoVuon : boolean; // Nhà có vườn không
ChieuRongVuon : real; // Chiều rộng vườn tính theo m
HuongNha : Byte; // Hướng nhà (Đông = 0, Tây = 1,
ChuQuyen : Byte; // Nam = 2, Bắc = 3, Đông Bắc = 4,
// Đông Nam = 5, Tây Bắc = 6
// Tây Nam = 7
DienTich : real; // Diện tích nhà (m vuông)

rent_roi : boolean; // Nhà đã thuê rồi
sell_roi : boolean; // Nhà đã bán rồi
NgayDauThue : TDateTime; // Ngày bắt đầu thuê nhà
NgayCuoiThue : TDateTime; // Ngày kết thúc thuê nhà
end;
Các tập tin dữ liệu trong chương trình gồm có:
ltdata.dic : file of THomeInfo, chứa thông tin nhà cửa
ltidx.dic : file of longint, index file
ltrent.dic : file of longint, lưu index các nhà đã cho thuê
ltsell.dic : file of longint, lưu index các nhà đã bán
3.2.2 Kết nối cho client
Ta kết nối cho một client bằng đoạn mã sau:
with ClientSocket do
begin
Host := DomainName;
Active := True;
end;
Tùy vào quyền đã đăng ký của người sử dụng, chương trình sẽ hiện lên khung trao đổi
tương ứng. Chẳng hạn, nếu quyền sử dụng là khách hàng, chương trình chỉ hiện ra các
chức năng cho phép họ tìm kiếm, đăng ký thuê mua nhà… nhưng không hiện ra các chức
năng sửa đổi dữ liệu.
21
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
3.2.3 Hủy kết nối cho client
Ta hủy kết nối cho một client bằng đoạn mã sau:
ClientSocket.Close;
3.2.4 Tranh chấp dữ liệu
Để tránh dữ liệu có thể bò hư hỏng khi nhiều client cùng sửa đổi dữ liệu nằm trên máy

server, chương trình đã giải quyết đượïc vấn đề này bằng cách sử dụng các hàm API của
windows, xin xem phần 1.3 của bài báo cáo này.
3.2.5 Dùng thread để phân chia CPU cho các thao tác của client
Để trong cùng một thời gian, nhiều client có thể truy cập đến cùng một dữ liệu nằm
trên máy server, ta dùng thread. Xin xem phần 1 của bài báo cáo này để biết cách dùng
thread.
Bạn cũng có thể xem Đồ Án Môn Học – Thread trong Delphi của Lê Tuấn,
KS2K6
để hiểu rõ hơn về thread, trong này cũng có source minh họa cho thread.
22
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
3.3 Các chức năng cho người quản lý
Đây là khung trao đổi chính của chương trình:
Chương trình cung cấp cho bạn hầu hết các tính năng của một trình quản lý dữ liệu
thông thường.
Các thao tác trên dữ liệu thực chất đều do chương trình server đảm nhận.
23
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
3.3.1 Tìm kiếm một nhà
Toàn bộ nhà có trong từ điển (không kể nhà đã thuê hay bán) sẽ được liệt kê trong một
listbox. Danh sách nhà này được sắp xếp theo alphabet theo tên gợi nhớ của nhà.
Chương trình cho bạn một ô soạn thảo để gõ tên nhà cần tìm vào, khi gõ đến đâu,
chương trình tự động nhảy đến tên nhà gần giống với tên bạn gõ vào nhất.
Giải thuật lập trình cho Tìm kiếm nhà
Ô soạn thảo TEdit đón sự kiện OnChange, mỗi khi có sự thay đổi, chương trình sẽ tạo
một thread tên THomeSearchTextThread.

procedure THomeSearchTextThread.Execute;
begin
EnterCriticalSection(CritSect);
Synchronize(DoThread);
LeaveCriticalSection(CritSect);
end;
Hàm DoThread này chủ yếu gọi hàm HomeSearch được mô tả dưới đây:

function HomeSearch (TênNhà : string; var found : boolean) : longint;
Hàm này tìm kiếm trong danh sách nhà có TênNhà như tham số đưa vào không?
Input :
TênNhà : Tên nhà cần tìm
Output:
found = True, tìm thấy nhà. Giá trò hàm trả về là vò trí index của nhà vừa tìm được.
found = False, không tìm thấy nhà. Giá trò trả về là vò trí index có tên nhà gần giống
nhất với tên nhà cần tìm.
24
Kinh Doanh Nhà Trên Mạng Client/Server – Thầy Thoại Nam – Sinh Viên Lê Tuấn
---------------------------------------------------------------------------------------------------------------------------
------------------
3.3.2 Lấy thông tin của một nhà
Mỗi khi người dùng nhấn chuột vào một nhà trong danh sách nhà, chương trình sẽ sinh
ra một thread tên THomeGetDataThread để lấy mọi thông tin về nhà.

procedure THomeGetDataThread.Execute;
begin
EnterCriticalSection(CritSect);
Synchronize(DoThread);
LeaveCriticalSection(CritSect);
end;

Hàm DoThread này chủ yếu sẽ gọi hàm HomeGet được mô tả như sau:
function HomeGet(index : longint) : THomeInfo;
var
IndexData : longint;
begin
if (index < 0) or (index > homeCount) then exit;
Seek(indexfile, index);
Read(indexfile, IndexData);
Seek(dataFile, IndexData);
Read(dataFile, result);
end;
Đưa vào index là vò trí cần lấy thông tin nhà. Hàm này trả về kết quả kiểu ThomeInfo
là thông tin của toàn bộ về nhà.
25

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×