我在程序中定义了一个线程类TInsertThread,它的定义如下:
  //插入SCADA纪录的线程
  TInsertThread=class(TThread)
  private
    //数据库代理
    ThrdDBAgent: IPMDbAgent;
    //取点周期(以时间为单位)
    FPtCycle: Integer;
    //取点时间
    FPtTime: TDateTime;
    //SCADA点数
    FPtNum:Integer;
    //点信息指针
    FPtInfList:TList;
  protected
    procedure Execute; override;
  public
    constructor Create(PtCycle:Integer;PtTime:TDateTime);
    //Database.
    procedure InsertSCADADataRecord(PPtInf:PPointInf;PtTime:TDateTime);
  end;程序中线程执行代码为:
procedure TInsertThread.Execute;
var
  I:Integer;
  PPtInf:PPointInf;
begin
  for I:=0 to (FPtInfList.Count-1) do
  begin
    PPtInf:=FPtInfList.Items[I];
    InsertSCADADataRecord(PPtInf, FPtTime);
  end;
end;  程序运行时每隔1分钟调用周期(FPtCycle)为1分钟的线程,每隔15分钟调用周期为15分钟的线程,所以每次在整15分钟时实际调用了2个线程(周期为1分钟和周期为15分钟)。
  实际运行情况时运行了几个小时后总是在整15分钟出错,我知道是多线程产生了冲突,可是就是
找不出在什么地方,那位熟悉多线程的兄弟能指点小弟一下。

解决方案 »

  1.   

    procedure TInsertThread.Execute;
    var
      I:Integer;
      PPtInf:PPointInf;
    begin
      for I:=0 to (FPtInfList.Count-1) do
      begin
        PPtInf:=FPtInfList.Items[I];
        InsertSCADADataRecord(PPtInf, FPtTime);
        sleep();//加个sleep
      end;
    end;
    一般可以使用临界区、互斥、信号量和事件等来解决线程同步的问题
    必要时还可以设置线程的优先级
      

  2.   

    呵呵,电力监控系统的??
    代码不够详细,你可以试试需要存储的数据作为局部变量存储,然后调用无参数方法同步。procedure TInsertThread.Execute;
    var
      I:Integer;
    begin
      for I:=0 to (FPtInfList.Count-1) do
      begin
        PPtInf:=FPtInfList.Items[I];//PPtInf定义为类的局部变量。
        Synchronize(InsertSCADADataRecord);
      end;
    end;
      

  3.   

    俗话说对症下药,建议楼主还是先找到出错的具体原因吧。
    插入一些测试代码,让自己可以在出错的时候获取某些必要信息,看看究竟是那里出错。
    如果是线条同步冲突,可以试着用临界区、互斥、信号量等等方式;
    如果是和主线程冲突,看看是否在线程中不恰当的使用了VCL控件(大部分VCL控件均不保证线程安全);