http://expert.csdn.net/Expert/topic/2642/2642317.xml?temp=.6756708

解决方案 »

  1.   

    ThreadProc的类型定义是:TThreadMethod = procedure of object
    在线程中需要用Synchronize方法进行调用
    你可以看一下Delphi中关于线程的Demo
      

  2.   

    Synchronize
    是为一些非进程安全函数或控件准备的,并不是一定要调用,对于哪些函数属于非进程安全,在delphi的help中有说明的。
      

  3.   

    对于线程,不一定要用T类,可以使用api函数。Createthread吧,记不清出了。
      

  4.   

    使用Thread类更好操作,在线程中如果需要同步使用VCL组件的话,就应该调用Synchronize方法,被同步的函数不接受参数。
      

  5.   

    同步有几中方法:
    1、Synchronize方法
    2、sendmessage、postmessage
    3、临界区
      

  6.   

    对delphi的Synchronize方法不太清楚,试一下先:)
      

  7.   

    unit Unit2;interfaceuses
      Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF};type
      ThreadProc=procedure(p:Pointer) of object;  MyThread = class(TThread)
      private
        pProc:ThreadProc;
        procedure SetName;
      protected
        procedure Execute; override;
      public
          pParam:Pointer;
        constructor create(ProcAddr:ThreadProc);overload;
      end;implementation{ Important: Methods and properties of objects in visual components can only be
      used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure MyThread.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{$IFDEF MSWINDOWS}
    type
      TThreadNameInfo = record
        FType: LongWord;     // must be 0x1000
        FName: PChar;        // pointer to name (in user address space)
        FThreadID: LongWord; // thread ID (-1 indicates caller thread)
        FFlags: LongWord;    // reserved for future use, must be zero
      end;
    {$ENDIF}{ MyThread }procedure MyThread.SetName;
    {$IFDEF MSWINDOWS}
    var
      ThreadNameInfo: TThreadNameInfo;
    {$ENDIF}
    begin
    {$IFDEF MSWINDOWS}
      ThreadNameInfo.FType := $1000;
      ThreadNameInfo.FName := 'aaa';
      ThreadNameInfo.FThreadID := $FFFFFFFF;
      ThreadNameInfo.FFlags := 0;  try
        RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
      except
      end;
    {$ENDIF}
    end;procedure MyThread.Execute;
    begin
      SetName;
      if(pProc<>nil) then pProc(pParam);
      { Place thread code here }
    end;constructor MyThread.create(ProcAddr: ThreadProc);
    begin
    self.pProc:=ProcAddr;
    end;end.