implementationvar
  hHandle: THandle;
  I: Integer;
  pt: TPoint;{$R *.dfm}procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ID: DWORD;
begin
  pt.X := X;
  pt.Y := Y;
  CreateThread(nil, 0, @ThreadRun, Pointer(@pt), 0, ID);
end;                //运行到这里时@pt内存为 $D7B7A0procedure ThreadRun(p: Pointer);   //但传进来后p内存为  $76F9ED5A
var
  X, Y: Integer;
  I: Integer;
  pt2: TPoint;
begin
  pt2 := PPoint(p)^;   
  X := pt2.X;
  Y := pt2.Y;
  for I := 0 to 1000000 do
    with Form1.Canvas do
    begin
      Lock;
      TextOut(X, Y, IntToStr(I));
      Unlock;
    end;
end;end.请问为什么往过程里传递指针 给变了~~

解决方案 »

  1.   

    加上stdcall就行了:procedure ThreadRun(p: Pointer); stdcall;
      

  2.   


    哦。。这个不是dll里用的嘛?这里为什么需要呢?能不能解释一下哈
      

  3.   

    BeginThread(nil, 0, @ThreadRun, @pt, 0, ID);
    delphi中永远不要使用createthread来创建线程,使用 beginthread 来创建。
    如果使用c++,也不要使用api createthread 来创建显示,应使用_beginthreadex。
      

  4.   

    函数的入栈决定:
    _beginthread需要_cdecl的线程函数地址,_beginthreadex和_CreateThread需要_stdcall 的线程函数地址
      

  5.   


    哦。。这个不是dll里用的嘛?这里为什么需要呢?能不能解释一下哈函数的入栈方式决定
      

  6.   

    CreateThread 改 begingthread 就行了,其他什么都不用改,beginthread内部已经全部帮你完成
    type
      PThreadRec = ^TThreadRec;
      TThreadRec = record
        Func: TThreadFunc;
        Parameter: Pointer;
      end;
      
    {$IFDEF MSWINDOWS}
    function ThreadWrapper(Parameter: Pointer): Integer; stdcall;
    {$ELSE}
    function ThreadWrapper(Parameter: Pointer): Pointer; cdecl;
    {$ENDIF}{$IFDEF MSWINDOWS}
    function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
      ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
      var ThreadId: LongWord): Integer;
    var
      P: PThreadRec;
    begin
      New(P);
      P.Func := ThreadFunc;
      P.Parameter := Parameter;// 把回调函数及其参数指针重新封装到一个结构体内
      IsMultiThread := True; // 把全局变量IsMultiThread设为True
      // 最后也是调用了CreateThread
      Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
        CreationFlags, ThreadID);
    end;......
    (* 
    这就是为什么delphi中要用beginthread替代createthread的原因c++的理由也一样
    四、为什么用_beginthreadex而不是CreateThread?
    为什么要用C运行时库的_beginthreadex代替操作系统的CreateThread来创建线程?来源自自1999年7月MSJ杂志的《Win32 Q&A》栏目你也许会说我一直用CreateThread来创建线程,一直都工作得好好的,为什么要用_beginthreadex来代替CreateThread,下面让我来告诉你为什么。回答一个问题可以有两种方式,一种是简单的,一种是复杂的。如果你不愿意看下面的长篇大论,那我可以告诉你简单的答案:_beginthreadex在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更安全。《windows 核心编程》第6章也有说明。*)