想要给线程函数传两个参数,
不知道怎么传不进去,
麻烦帮忙看看了。还有,多线程的程序怎么调试?谢谢啦!function Th_fun_2(p_par: PPar): Integer; stdcall;
var
I: Integer;
begin
for I := 1 to p_par.para1 do
begin
Form1.mmo1.Lines.Add(p_par.para2);
end; Result := 0;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
p: PPar;
a: par;
ThreadID: DWORD;
hThread: THandle;
begin
a.para1 := 5;
a.para2 := 'NTU'; p := @a; hThread := CreateThread(nil,
0,
@Th_fun_2,
p,
0,
ThreadID);
end;
不知道怎么传不进去,
麻烦帮忙看看了。还有,多线程的程序怎么调试?谢谢啦!function Th_fun_2(p_par: PPar): Integer; stdcall;
var
I: Integer;
begin
for I := 1 to p_par.para1 do
begin
Form1.mmo1.Lines.Add(p_par.para2);
end; Result := 0;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
p: PPar;
a: par;
ThreadID: DWORD;
hThread: THandle;
begin
a.para1 := 5;
a.para2 := 'NTU'; p := @a; hThread := CreateThread(nil,
0,
@Th_fun_2,
p,
0,
ThreadID);
end;
Par=packed record
para1 : Integer;
para2 : String[20];
end;
PPar = ^Par;function Th_fun_2(p_par: PPar): Integer; stdcall;
var
I: Integer;
begin
for I := 1 to p_par^.para1 do
begin
Form1.memo1.Lines.Add(p_par^.para2);
end; Result := 0;
end;
var
a: par; //这个必须改成全局的。你为果不改成全局的。一但函数执行完毕。那么他就会 删除这个变量。线程中就会引用一个空地址!
//你 错就错在这儿。 记住线程传参数 是传的一个地址,地址中是什么类型由你控制就行了。如果你想动态来做。那你可以在下面。直接 new 一个地址就行了。这样也行
//但你记得在线程中你要 回收这个内存。不然 会有内存泄露。。
procedure TForm1.Button1Click(Sender: TObject);
var
p: PPar;
ThreadID: DWORD;
hThread: THandle;
begin
a.para1 := 5;
a.para2 := 'NTU'; p := @a; hThread := CreateThread(nil,
0,
@Th_fun_2,
p,
0,
ThreadID);
end;
p: PPar;
a: par;
ThreadID: DWORD;
hThread: THandle;
begin
NEW(P);
P^.para1 := 5;
P^.para2 := 'NTU';hThread := CreateThread(nil,
0,
@Th_fun_2,
p,
0,
ThreadID); 就可以传进去了,但需要你自己释放
参数的指针在工作线程中一定要有效才行,就是其生命期还未结束。
不一定要用全局变量,也可以是对象实例,要保证在工作线程执行完前没有释放。