delphi
中多執行緒用訊息實現
vcl
資料同步顯示
lanno ckeeke
2006-5-12
概述:delphi中嚴格區分主線程和子主線程,主線程負責gui的更新,子執行緒負責資料運算,當資料執行完畢後,子執行緒可以向主線程式傳送訊息,以便通知其將vcl中的資料更新。
實現:關鍵在於訊息的傳送及接收。在訊息結構tmessage中wparam和lparam型別為longint,而指標型別也定義為longint,可以通過此指標來傳遞自己所感興趣的資料。如傳遞字元陣列:
陣列定義:
const
max_len = 260;
szname : array[0..max_len] of char;
訊息傳送方式:
postmessage(form1.handle,wm_updatedata,integer(pchar(@szname)),0);
訊息接收方式:
procedure tform1.wmupdatedata(var msg : tmessage);
begin
self.showdata.items.add(pchar(msg.wparam));
end;
子執行緒中定義兩個資料型別:
public
szname : array[0..max_len] of char;
nindex : integer;
完整**:
子執行緒類:
unit tchildthread;
inte***ce
uses
classes,
messages,windows,sysutils;//
新增的使用檔案
const max_len = 260;
type
tchildthreads = class(tthread)
private
protected
procedure execute; override;
public
szname : array[0..max_len] of char;
nindex : integer;
end;
implementation
uses
unit1;
procedure tchildthreads.execute;
begin
postmessage(form1.handle,wm_updatedata,integer(pchar(@szname)),0);
//注意型別轉化部分的寫法
end;
end.
主線程**:
unit unit1;
inte***ce
uses
windows, messages, sysutils, variants, classes, graphics, controls, forms,
dialogs, stdctrls, comctrls;
const
wm_updatedata = wm_user + 100;//
自定義的訊息,利用此訊息來實現對
gui的更新
type
tform1 = class(tform)
controlpannel: tgroupbox;
startthreads: tbutton;
tabcontrol1: ttabcontrol;
singlethread: tradiobutton;
multiplethreads: tradiobutton;
stopthreads: tbutton;
showdata: tlistbox;
showerror: tlistbox;
initialize: tbutton;
cleanup: tbutton;
//gui
更新的訊息處理函式宣告
procedure wmupdatedata(var msg : tmessage);message wm_updatedata;
procedure startthreadsclick(sender: tobject);
private
public
end;
var
form1: tform1;
implementation
uses
tchildthread;
//訊息函式定義
procedure tform1.wmupdatedata(var msg : tmessage);
begin
self.showdata.items.add(pchar(msg.wparam));
end;
procedure tform1.startthreadsclick(sender: tobject);
var
ochildthread : array[0..1000] of tchildthreads;
i : integer;
begin
for i := 0 to 1000 do
begin
ochildthread[i] := tchildthreads.create(true);
//向
vcl中傳送的資料
strcopy(@ochildthread[i].szname,pchar('child' + inttostr(i)));
ochildthread[i].nindex := i;
ochildthread[i].resume;
end;
end;
end.
在delphi執行緒中實現訊息迴圈
在delphi執行緒中實現訊息迴圈 2003 6 22 10 56 00 檢視評語 2003 6 22 11 02 24 我參考了一下msdn,還有windows核心程式設計.寫了乙個類來封裝這個功能,不知道對不對.裡面使用了兩個方法,乙個使用乙個隱含窗體來處理訊息 還有乙個是直接使用thread的...
Delphi中多執行緒中Synchronize的運用
delphi中多執行緒用synchronize實現vcl資料同步顯示,delphi中多執行緒用synchronize實現vcl資料同步顯示 概述 vcl實現同步的另一種方法就是呼叫執行緒類的synchronize的過程,此過程需要乙個無引數的procedure,故在此procedure中無法傳遞引數...
delphi 多執行緒
摘自 萬一的部落格 functionmyfun p pointer integer stdcall var i integer begin fori 0to500000do begin form1.canvas.lock form1.canvas.textout 10,10,inttostr i f...