我在学多线程的时候编了一个测试程序,是用Delphi写的。编译通过了,但是运行的结果老是说函数ThreadProc中p指针为空,各位帮忙看看是怎么回事?
(由于我现在手上没有任何编译器,可能会有语法错误,但这不是我关心的问题,我关心的是为什么ThreadProc中的p指针问什么是0)unit unit1;Interfaceuses
   windows,...;type
  TForm1=class(TForm)
    Button1:TButton;
  procedure FormCreate(sendor:TObject);
  private:
  {private members}
  public:
  {public members}
end;//declaration of thread procedure
procedure ThreadProc(p:pointer);//Global variables
var
  Form1:TForm1;
  hThread:HThread;
  ThreadID:DWORD;
  p:pointer;implementationprocedure TForm1.FormCreate(sendor:TObject);
begin
  GetMem(p,1);  
  pchar(p)^:='a';//对否?不管啦,反正不做也没关系    (#)
  //创建一个线程,并挂起;  
  hThread:=CreateThread(nil,0,@ThreadProc,p,CREATE_SUSPENDED,ThreadID);
end;procedure TForm1.Button1Click(sendor:Tobject)
begin
  //启动线程  
  ResumeThread(hThread);
end;procedure ThreadProc(p:pointer);
begin
  if p=nil exit;                                  (*)
  .........
end;end.在(*)处就跳出,就是说p为nil,但是我在传递前,在(#)处看到的p却不是nil,这是怎么回事?

解决方案 »

  1.   

    我在学多线程的时候编了一个测试程序,是用Delphi写的。编译通过了,但是运行的结果老是说函数ThreadProc中p指针为空,各位帮忙看看是怎么回事?
    (由于我现在手上没有任何编译器,可能会有语法错误,但这不是我关心的问题,我关心的是为什么ThreadProc中的p指针问什么是0)unit unit1;Interfaceuses
       windows,...;type
      TForm1=class(TForm)
        Button1:TButton;
      procedure FormCreate(sendor:TObject);
      private:
      {private members}
      public:
      {public members}
    end;//declaration of thread procedure
    procedure ThreadProc(p:pointer);//Global variables
    var
      Form1:TForm1;
      hThread:HThread;
      ThreadID:DWORD;
      p:pointer;implementationprocedure TForm1.FormCreate(sendor:TObject);
    begin
      GetMem(p,1);  
      pchar(p)^:='a';//对否?不管啦,反正不做也没关系    (#)
      //创建一个线程,并挂起;  
      hThread:=CreateThread(nil,0,@ThreadProc,p,CREATE_SUSPENDED,ThreadID);
    end;procedure TForm1.Button1Click(sendor:Tobject)
    begin
      //启动线程  
      ResumeThread(hThread);
    end;procedure ThreadProc(p:pointer);
    begin
      if p=nil exit;                                  (*)
      .........
    end;end.在(*)处就跳出,就是说p为nil,但是我在传递前,在(#)处看到的p却不是nil,这是怎么回事?
      

  2.   

    要指明函数为标准调用方式。procedure ThreadProc(p: pointer);    stdcall;
      

  3.   

    调用时参数如栈的方式不同
    windows使用的是stdcall方式从右到左
    delphi默认使用从左到右方式