Tìm hiểu về thread trong delphi - pdf 27

Download miễn phí Tìm hiểu về thread trong delphi



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 22
3.2.3 Hủy kết nối cho client 23
3.2.4 Tranh chấp dữ liệu 23
3.2.5 Dùng thread để phân chia CPU cho các thao tác của client 23
3.3 Các chức năng cho người quản lý 24
3.3.1 Tìm kiếm một nhà 25
3.3.2 Lấy thông tin của một nhà 26
3.3.3 Thêm thông tin một nhà mới 27
3.3.4 Xóa thông tin một nhà 29
3.3.5 Cập nhật thông tin một nhà 30
3.3.6 Thống kê số nhà đã cho thuê 32
3.3.6.1 Đếm số nhà đã cho thuê 32
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ê 33
3.3.7 Thống kê số nhà đã bán 37
3.3.7.1 Đếm số nhà đã bán 37
3.4 Các chức năng cho người cập nhật thông tin nhà 38
3.4.1 Tìm kiếm một nhà 39
3.4.2 Lấy thông tin của một nhà 39
3.4.3 Cập nhật thông tin một nhà 39
3.4.4 Thêm thông tin một nhà mới 40
3.4.5 Xóa thông tin một nhà 40
3.5 Các chức năng cho một khách hàng 41
3.5.1 Lấy thông tin về một nhà 41
3.5.2 Tìm kiếm một nhà 41
3.5.3 Tìm kiếm theo điều kiện 43
3.5.4 Đăng ký thuê nhà 48
3.5.5 Đăng ký mua nhà 52
3.6 Mã chương trình kinh doanh nhà đất trên mạng client/server 55
3.6.1 Nha.dpr 55
3.6.2 Nhaf.pas 56
3.6.3 ConectDlg.pas 78
3.6.4 Findf.pas 81
3.6.5 HomeInfo.pas 85
3.6.6 HomeTools.pas 88
3.6.7 Informf.pas 105
3.6.8 InputThuef.pas 107
3.6.9 MytdRTF.pas 109
3.6.10 MyThread.pas 113
3.6.11 RepThuef.pas 129
 
 





Để tải tài liệu này, vui lòng Trả lời bài viết, Mods sẽ gửi Link download cho bạn ngay qua hòm tin nhắn.

Ket-noi - Kho tài liệu miễn phí lớn nhất của bạn


Ai cần tài liệu gì mà không tìm thấy ở Ket-noi, đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:


ịnh mua căn nhà đã chọn.
Thao tác trong chương trình để cho mua một căn nhà làm như sau:
Chương trình client sẽ gửi một thông điệp đến server yêu cầu mua nhà kèm theo vị trí của nhà trong danh sách nhà. Khi nhận được thông điệp thuê nhà này, chương trình server sẽ tạo ra một thread tên TMuaNhaThread:
procedure TMuaNhaThread.Execute;
begin
EnterCriticalSection(CritSect);
Synchronize(DoThread);
LeaveCriticalSection(CritSect);
end;
DoThread trong mua nhà chủ yếu gọi lệnh sau:
if HomeData.HomeSell(index) then
ServerUpdateVLB
Ý nghĩa của hàm HomSell như sau:
function THomeData.HomeSell(index : longint) : boolean;
var
count, dataIndex : longint;
buf : pchar;
ftidx : TIndexfile;
begin
result := false;
if index < 0 then exit;
seek(indexfile, index);
read(indexfile, dataindex);
// dataindex là vị trí của thông tin nhà trong datafile
seek(sellfile, filesize(sellfile));
write(sellfile, dataindex);
// Ghi 4 byte của dataindex vào cuối sellfile
// Các lệnh sau đây để xóa 4 byte tại vị trí index trong indexfile. Sau khi thực hiện, indexfile
giảm 4 byte
assignfile(ftidx, pathname + '1z2y3x4w.qgb');
rewrite(ftidx);
count := index;
if count > 0 then
begin
getmem(buf, count*idxtypeSize);
seek(IndexFile, 0);
blockread(IndexFile, buf^, count);
blockwrite(ftIdx, buf^, count);
freemem(buf, count*idxtypeSize);
end;
count := filesize(IndexFile)- count - 1;
if count > 0 then
begin
getmem(buf, count*idxtypeSize);
seek(IndexFile, index + 1);
blockread(IndexFile, buf^, count);
blockwrite(ftidx, buf^, count);
freemem(buf, count*idxtypeSize);
end;
result := IOResult = 0;
if result then
begin
CloseFile(ftIdx);
CloseFile(IndexFile);
Erase(IndexFile);
Rename(ftIdx, indexfilename);
AssignFile(IndexFile, indexfilename);
Reset(IndexFile);
end;
end;
Dĩ nhiên thông tin về căn nhà vừa bán sẽ không bị mất đi. Người quản lý vẫn có thể xem thông tin về các nhà đã bán.
Mã chương trình kinh doanh nhà đất trên mạng client/server
Nha.dpr
Nha.dpr là chương trình chính.
(* nha.dpr
Written by Le Tuan
*)
program nha;
uses
Graphics,
Controls,
Forms,
nhaf in 'nhaf.pas' {ChatForm},
conectdlg in 'conectdlg.pas' {ConnectDlg},
myThread in 'myThread.pas',
homeInfo in 'homeInfo.pas' {HomeInfoForm},
hometools in 'hometools.pas',
findf in 'Findf.pas' {FindForm},
mytdrtf in 'mytdrtf.pas',
repthuef in 'repthuef.pas' {RepThueForm},
inputthuef in 'inputthuef.pas' {InputThue},
informf in 'informf.pas' {InfoForm};
{$R *.RES}
begin
ConnectDlg := TConnectDlg.Create(Application);
with ConnectDlg do
begin
if ShowModal = mrOK then
begin
ChatForm := TChatForm.Create(application);
ChatForm.ShowModal;
ChatForm.Release;
end;
Release;
end;
end.
Nhaf.pas
Nhaf.pas chứa khung trao đổi chính của chương trình. Khung trao đổi này dùng chung cho cả 3 đối tượng người sử dụng, tuy nhiên cũng có một số khác biệt nhỏ.
(* nhaf.pas
Written by Le Tuan
*)
unit nhaf;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, Menus, StdCtrls, Buttons, ScktComp, ExtCtrls,
ComCtrls, VLB, homeInfo, HomeTools, MyThread, Findf, Tranbtn,
ShadowForm, mytdRTF, myDialog, inputthuef, QFButton, InformF;
const
WM_ChangeIndex = WM_USER + 5000;
type
TChatForm = class(TShadowForm)
Image1: TImage;
VLB: TVLB;
TextSearch: TEdit;
Label1: TLabel;
Bevel1: TBevel;
RichEdit1: TRichEdit;
Bevel2: TBevel;
Bevel3: TBevel;
AdminLTBtnAdd: TLTBtn;
AdminLTBtnModify: TLTBtn;
AdminLTBtnDel: TLTBtn;
DicLTBtnModify: TLTBtn;
DicLTBtnDel: TLTBtn;
DicLTBtnAdd: TLTBtn;
Bevel4: TBevel;
ClientSocket: TClientSocket;
ServerSocket: TServerSocket;
CusLTBtnFind: TLTBtn;
CusLTBtnThue: TLTBtn;
CusLTBtnBan: TLTBtn;
AdminLTBtnRepThue: TLTBtn;
Image2: TImage;
AdminLTBtnRepBan: TLTBtn;
Image3: TImage;
QFButton1: TQFButton;
Image4: TImage;
LabelName: TLabel;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure VLBGetItem(Sender: TObject; Index: Integer;
var ItemString: String);
procedure VLBClick(Sender: TObject);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure CusLTBtnFindClick(Sender: TObject);
procedure CusLTBtnThueClick(Sender: TObject);
procedure CusLTBtnBanClick(Sender: TObject);
procedure DicLTBtnModifyClick(Sender: TObject);
procedure DicLTBtnDelClick(Sender: TObject);
procedure DicLTBtnAddClick(Sender: TObject);
procedure AdminLTBtnAddClick(Sender: TObject);
procedure AdminLTBtnDelClick(Sender: TObject);
procedure AdminLTBtnModifyClick(Sender: TObject);
procedure TextSearchChange(Sender: TObject);
procedure TextSearchKeyPress(Sender: TObject;
var Key: Char);
procedure AdminLTBtnRepThueClick(Sender: TObject);
procedure AdminLTBtnRepBanClick(Sender: TObject);
procedure QFButton1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
procedure wmNcHitTest(var Msg : TwmNcHitTest);
message wm_NcHitTest;
function TestTLTBtn(p : TPoint) : boolean;
procedure DrawForm(Level : integer);
private
function FindClient(ClientSocket :
TCustomWinSocket) : integer;
procedure ShowData;
procedure ConnectAdmin;
procedure ConnectModifier;
procedure ConnectCustomer;
function SetHomeInfo(hasDefault : boolean) : boolean;
procedure ServerUpdateVLB;
procedure FileListenItemClick(Sender: TObject);
public
homeData : THomeData;
fHome, ffhome : THomeInfo;
fIndex : longint;
procedure InsertData(Home : THomeInfo);
procedure ModifyData(index : longint; Home : THomeInfo);
procedure MuaNha(Index : Longint);
procedure ThueNha(Index : Longint;
NgayDau, NgayCuoi : TDateTime);
procedure DeleteNha(Index : Longint);
procedure SendMessageToServer(Socket : TCustomWinSocket;
mess : pchar; index : longint; home : THomeInfo);
procedure SendMessageToClient(Socket : TCustomWinSocket;
mess : pchar; index : longint; home : THomeInfo);
procedure ChangeIndex(var msg : TMessage);
message WM_ChangeIndex;
public
{ Public declarations }
procedure DrawShadowBox(fCanvas : TCanvas; R: TRect);
procedure DrawShadow(fCanvas : TCanvas; R: TRect);
procedure PaintBack(fCanvas : TCanvas; B : TBitmap);
end;
type
TMyHintWindow = class(THintWindow)
constructor Create(AOwner : TComponent); override;
end;
type
xxType = packed record
mess : array[0..19] of char;
index : longint;
Home : THomeInfo;
end;
const
sz = sizeof(xxType);
idGetData : pchar = '$GetData$';
idSetData : pchar = '$SetData$';
idGetItem : pchar = '$GetItem$';
idSetItem : pchar = '$SetItem$';
idGetVLBNumItems : pchar = '$GetVLBNumItems$';
idSetVLBNumItems : pchar = '$SetVLBNumItems$';
idSetPageControl : pchar = '$idSetPageControl$';
idInsertData : pchar = '$idInsertData$';
idModifyData : pchar = '$idModifyData$';
idDelete : pchar = '$idDelete$';
idMuaNha : pchar = '$idMuaNha$';
idThueNha : pchar = '$idThueNha$';
idTimNha : pchar = '$idTimNha$';
idFind : pchar = '$idfind$';
idFindResult : pchar = '$idFindResult$';
idPaintVLB : pchar = '$idPaintVLB$';
idSetItemFilter : pchar = '$idSetItemFilter$';
idGetItemFilter : pchar = '$idGetItemFilter$';
idSetIndex : pchar = '$idSetIndex$';
Received : Boolean = false;
DataReceived : Boolean = false;
ItemReceived : Boolean = false;
ClientConnected : Boolean = false;
ListenChecked : Boolean = False;
IsServer : Boolean = false;
VLBClicking : boolean = false;
var
ChatForm: TChatForm;
Server: String;
CritSect : TRTLCriticalSection;
implementation
uses conectdlg, repthuef;
{$R *.DFM}
function GetPath : string;
var
i : byte;
begin
result := ParamStr(0);
i := length(result);
while (i > 0) and (result '\') do dec(i);
result := copy(result, 1, i);
end;
procedure WaitForReceived;
begin
repeat
Application.ProcessMessages;
until Received;
end;
constructor TMyHintWindow.Create(Aowner:TComponent);
begin
inherited Create(Aowner);
Canvas.Font.Name := 'Vietnam';
Canvas.Font.Size := 8;
end;
procedure TChatForm.ModifyData(index : longint;
Home : THomeInfo);
begin
if HomeData.HomeModify(home, index) then
ServerUpdateVLB
else
VMessageDlg('Lši thuˆ nh… "' + Home.TenNha + '"',
mtInformation, [mbOk], 0);
end;
procedure TChatForm.InsertData;
var
Index : longint;
begin
HomeData.HomeInsert(Home, index);
ServerUpdateVLB;
end;
procedure TChatForm.MuaNha(Index : Longint);
begin
if HomeData.HomeSell(index) then
ServerUpdateVLB
else
VMe...
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status