rt
希望能举个例子说明一下,谢谢

解决方案 »

  1.   

    调用CreateThread来实现多线程和继承线程类来实现多线程有什么区别吗?
      

  2.   

    当然有了。简单点说,TThread 封装了 thread 操作,也就是封装了delphi 的函数 BeginThread/EndThread 。看下 TThread 的构造函数:constructor TThread.Create(CreateSuspended: Boolean);
    {$IFDEF LINUX}
    var
      ErrCode: Integer;
    {$ENDIF}
    begin
      inherited Create;
      AddThread;
      FSuspended := CreateSuspended;
      FCreateSuspended := CreateSuspended;
    {$IFDEF MSWINDOWS}
      FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
      if FHandle = 0 then
        raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
    {$ENDIF}
    {$IFDEF LINUX}
      sem_init(FCreateSuspendedSem, False, 0);
      ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
      if ErrCode <> 0 then
        raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
    {$ENDIF}
    end;
    里面创建线程是用的 BeginThread 函数,在看看它的代码:
    {$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;
      Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
        CreationFlags, ThreadID);
    end;
    procedure EndThread(ExitCode: Integer);
    begin
      ExitThread(ExitCode);
    end;
    {$ENDIF}{$IFDEF LINUX}
    function BeginThread(Attribute: PThreadAttr;
                         ThreadFunc: TThreadFunc;
                         Parameter: Pointer;
                         var ThreadId: Cardinal): Integer;
    var
      P: PThreadRec;
    begin
      if Assigned(BeginThreadProc) then
        Result := BeginThreadProc(Attribute, ThreadFunc, Parameter, ThreadId)
      else
      begin
        New(P);
        P.Func := ThreadFunc;
        P.Parameter := Parameter;
        IsMultiThread := True;
        Result := _pthread_create(ThreadID, Attribute, @ThreadWrapper, P);
      end;
    end;procedure EndThread(ExitCode: Integer);
    begin
      if Assigned(EndThreadProc) then
        EndThreadProc(ExitCode);
      // No "else" required since EndThreadProc does not (!!should not!!) return.
      _pthread_detach(GetCurrentThreadID);
      _pthread_exit(ExitCode);
    end;
    {$ENDIF}从上面的代码看, BeginThread/EndThread 两个函数是跨平台的。而 CreateThread/ExitThread 仅是 Widnows 下的。这下,能明白点了吧
      

  3.   

    忘了说很关键的一点,BeginThread 中设置了一个进程级变量 IsMultiThread ,表明这个进程是多线程或非多线程。如果用 CreateThread ,是不会设置这个变量的。