请问各位高手:能从子线程向主线程发送一个可变数组吗?如何发送? ( 积分: 200 )

  • 主题发起人 主题发起人 xda
  • 开始时间 开始时间
转化为字符串发送wm_copydata消息不行吗
 
可以吗? 我试试..
 
wm_copydata发消息,sendmessage需要句柄啊,怎么发啊,晕哦
wm_copydata用于进程间通信比较多,wm_gettext也可,线程间getwindowtext即可。
但发消息需要句柄啊。
 
小例子参考下
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
var
aArray: array of integer;
type
info= array of integer;
pinfo= ^info;
procedure TForm1.Button1Click(Sender: TObject);
procedure myThread1(ainfo: pinfo);stdcall;
begin
ainfo^[0]:= 3;
end;
var
th1: Cardinal;
begin
setlength(aArray,5);
aArray[0]:= 1;
aArray[1]:= 2;
aArray[2]:= 3;
aArray[3]:= 4;
aArray[4]:= 5;
CreateThread(nil,0,@myThread1,@aArray,0,th1);
sleep(100);
showmessage(IntToStr(aArray[0]));
end;

end.
 
内存共享
 
可以的,自定一个消息,在主线程中定义消息处理函数,用WPARAM或者LPARAM进行数据交换
 
谢谢各位的参与!
请问zhangyuntian:在子线程里面是用SendMessage或PostMessage吗?要传送的可变数组(或记录型变量)怎么与Msg、wParam、IParam进行强制转换呢?
 
我试了一下,思路是有了,可以用数组属性传递给主线程访问,但是在线程里面设置动态数组值时总出内存访问错误,不知道为什么,参考一下思路吧。
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;
type
TTestThread = class(TThread)
private
Fpb: TProgressBar;
iPos: integer;
FMyArray: array of integer;
proceduredo
WhatVCLAction;
function GetMyArray(index: integer): integer;
procedure SetMyArray(index: integer;
const Value: integer);
public
property MyArray[index: integer]: integer read GetMyArray write SetMyArray;
procedure Execute;
override;
constructor Create(pb: TProgressBar);
end;

implementation
{ TTestThread }
constructor TTestThread.Create(pb: TProgressBar);
begin
SetLength(FMyArray, pb.Max);
FillChar(FMyArray, Length(FMyArray), -1);
Fpb:= pb;
iPos:= pb.Position;
FreeOnTerminate:= true;
inherited Create(False);
end;

procedure TTestThread.DoWhatVCLAction;
begin
Fpb.Position:= iPos;
end;

procedure TTestThread.Execute;
begin
while iPos < 100do
begin
Inc(iPos);
MyArray[iPos - 1]:= iPos;
//通过属性传递给主线程,但是不知道为什么这里总出错。
synchronize(DoWhatVCLAction);
if Terminated then
exit;
Sleep(20);
end;
end;

function TTestThread.GetMyArray(index: integer): integer;
begin
Result:= FMyArray[index];
end;

procedure TTestThread.SetMyArray(index: integer;
const Value: integer);
begin
FMyArray[index]:= Value;
end;

end.

//--------form1--------
t: TTestThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
t:= TTestThread.Create(ProgressBar1);
这样访问: t.MyArray[N]
end;
 
mappingViewofFile 内存共享
 
定义一个公共数组,赋值的时候用临界区保护起来,赋值完毕发信号给主线程,让其去取数据不就可以了。(注意取值的位置)。
 
同意LS的,我只能看明白LS的了,呵呵...
 
对于可变的参数,最好用record(struct)结构来传递比较好。
 
我通常遇到这个问题都是设置一个公共变量区,然后子线程向主发消息,主自己去取。
 
后退
顶部