在下面的程序中,我想用CreateThread把线程函数设定为本类中的成员函数SendData
CreateThisThread中的CreateThread的第三个参数怎么写才是正确的?
type
FuncP=function (SendArray:array of byte;CuP:TPort):boolean of object; TSendThread=class
private
Func:FuncP;
SendEvent:THandle;
ThreadHandle:THandle;
ThreadID:DWord;
protected
procedure CreateThisEvent();
procedure CreateThisThread();
procedure SendData(SendArray:array of byte;CuP:TPort);
end;
procedure TSendThread.CreateThisThread;
begin
ThreadHandle:=CreateThread(nil,0,@self.func,nil,0,ThreadID);
if ThreadHandle=0 then
begin
messagebox(Form1.Handle,'Didn’t Create a Thread',nil,MB_OK);
end;
end;
procedure TSendThread.
SendData(SendArray:array of byte;CuP:TPort);
CreateThisThread中的CreateThread的第三个参数怎么写才是正确的?
type
FuncP=function (SendArray:array of byte;CuP:TPort):boolean of object; TSendThread=class
private
Func:FuncP;
SendEvent:THandle;
ThreadHandle:THandle;
ThreadID:DWord;
protected
procedure CreateThisEvent();
procedure CreateThisThread();
procedure SendData(SendArray:array of byte;CuP:TPort);
end;
procedure TSendThread.CreateThisThread;
begin
ThreadHandle:=CreateThread(nil,0,@self.func,nil,0,ThreadID);
if ThreadHandle=0 then
begin
messagebox(Form1.Handle,'Didn’t Create a Thread',nil,MB_OK);
end;
end;
procedure TSendThread.
SendData(SendArray:array of byte;CuP:TPort);
返回值为 DWORD,调用方式为 WINAPI(__stdcall),有一个 LPVOID 的参数(在 BCB 中为void *)
{
HANDLE hThrd;
DWORD threadId;
int i;
for ( i=0; i<5; i++ )
{
hThrd = CreateThread ( NULL,
0,
ThreadFunc,
(LPVOID) (i+ 1),
0,
&threadId);
if ( hThrd )
printf ( "Thread launched %d.\n", i );
}
}DWORD WINAPI ThreadFunc(LPVOID n)
{
printf ( "Create the %d times OK!\n", n );
return 0;
}
TSendThread=class(thread); 繼承後再在上面做你的代碼;
一般用 CreateThread 的,就是要求性能極度嚴格的,它比 class(thread)的性能要好!如果不是,不必這麼麻煩!
1、ThreadHandle:=CreateThread(nil,0,@self.func,nil,0,ThreadID);中的@self.func指的是哪个函数,依你的意思,应该是TSendThread.SendData,应该直接写这个函数(前提是TSendThread实例已经存在);
2、TSendThread.SendData如果作为线程运行,创建是传给它的参数只能有一个,而且必须是一个指针、整数、或DWORD型参数,SendData(SendArray:array of byte;CuP:TPort)包含了两个参数,显然不对。
修改建议:
1、定义一个线程创建时的参数记录:
Type TThreadParm=Packed Record
SendArray:array of byte;
CuP:TPort;
End;
PThreadParm=^TThreadParm;
2、定义参数变量
Var Parm:TThreadParm;
PParm:PThreadParm=@Parm;
3、修改线程函数:
TSendThread.SendData(TheParm:PParm);
4、创建线程:
ThreadHandle:=CreateThread(nil,0,@TSendThread.SendData,PParm,0,ThreadID);
对了,线程启动后,第一件事情就是应该将PParm传进来的参数保存在本地。