Delphi中多執行緒用訊息實現VCL資料同步顯示

2021-04-07 03:05:24 字數 2853 閱讀 8534

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...