type
  TLogOperate = class(TThread)
  private
    { Private declarations }
  protected
    procedure LogSaveToDB;
    procedure Execute; override;
  public
    constructor Create();
    destructor Destroy; override;
  end;implementation
  
{ TLogOperate }constructor TLogOperate.Create();
begin
  FreeOnTerminate := True;
  inherited Create(False);  
end;destructor TLogOperate.Destroy;
begin
  inherited;
end;procedure TLogOperate.Execute;
var
  pOPLogTmp: pOPLog;
begin
  { Place thread code here }
  Synchronize(LogSaveToDB);
end;procedure TLogOperate.LogSaveToDB;
var
  pOPLogTmp: pOPLog;
begin
  try
    //写日志,看是否执行到
  except
  end;end;
我用32个别的线程同时启动这个线程,这时发现在procedure TLogOperate.LogSaveToDB;中的代码没有写日志,也是说在32个线程中启动的这个线程有些没有执行LogSaveToDB这条语句,是不是和Synchronize这个有关系,请高手指教,谢谢....

解决方案 »

  1.   

    没有看到你全部的内容,不好说,但建议用临界区或者互斥对象之类的方法进行同步,
    Synchronize的原理如下,你看一下,和你的代码联系起来,分析一下应该可以找到问题的所在,
    在TThread中的Synchronize(),目的是通过它可以让线程的一些方法在主线程中执行。
    Synchronize( )把由Method参数传递过来的方法保存在TThread的FMethod字段中,然后,给线程窗口发一个CM_EXECPROC消息,并且把消息的lParam参数设为self(这里指线程对象)。当线程窗口的窗口过程收到这个消息后,它就调用FMethod字段所指定的方法。由于线程窗口是在主线程内创建的,线程窗口的窗口过程也将被主线程执行。你那32个线程根据优先级等情况,还要设计到线程的调度,也许有的线程不是没有执行logsavetodb操作,而是根本就没有调度
      

  2.   

    TSocketConnection因为这个控件的调用不能在线程中使用(这可能是delphi5的一个bug),所以要在主线程中执行