在下面的程序中,我想用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);

解决方案 »

  1.   

    CreateThread 函数的第三个参数是一个函数指针,指向某种特别的函数:
    返回值为 DWORD,调用方式为 WINAPI(__stdcall),有一个 LPVOID 的参数(在 BCB 中为void *)
      

  2.   

    void CreateMyThread(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;
    }
      

  3.   

    我覺得你的代碼很亂,有錯,如果你對thread不是很了解的話,不如直接:
    TSendThread=class(thread); 繼承後再在上面做你的代碼;
    一般用 CreateThread 的,就是要求性能極度嚴格的,它比 class(thread)的性能要好!如果不是,不必這麼麻煩!
      

  4.   

    你的程序中有两个地方可能有错误:
       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传进来的参数保存在本地。
      

  5.   

    再补充一点,我记得Windows的在Delphi中用CreateThread创建线程时,参数传不到线程中去,原因不清,后来我改为用Delphi的BeginThread函数就成功了,BeginThread与CreateThread的调用形式完全相同,好象是在System.pas中定义的。