我在程序中定义了一个线程类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分钟出错,我知道是多线程产生了冲突,可是就是
找不出在什么地方,那位熟悉多线程的兄弟能指点小弟一下。
//插入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分钟出错,我知道是多线程产生了冲突,可是就是
找不出在什么地方,那位熟悉多线程的兄弟能指点小弟一下。
解决方案 »
- 各们同行,你们骂我吧,鄙视我吧,我把别人的网站给黑了
- 100分提问,多年不用Delphi,自己写的都看不懂了,查询的问题
- 请教,为什么sendmessage发送TVM_SELECTITEM消息,告诉没定义。
- 有谁用过SetUp Factory6?知道怎么注册么?
- FastReport如何自定义纸张尺寸?
- 能不能实现这样的功能?
- 高手还在吗------关注!!!!!!!!!!!!当场给分
- 简单的问题搜索不到,只有问大家了:怎样用ADO把access数据库中表的数据导入到MS SQL数据库中的表中?
- 急求installshield Express 3.03的安装密码!!
- 我是琳琳,刚才提问有关音量问题的人。如果用一个TrackBar控制左右音道如何解决?
- 新手求教:如何在程序员设置动态生成的控件的属性?
- 存储过程输入参数为integer 型如何负值?~
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;
一般可以使用临界区、互斥、信号量和事件等来解决线程同步的问题
必要时还可以设置线程的优先级
代码不够详细,你可以试试需要存储的数据作为局部变量存储,然后调用无参数方法同步。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;
插入一些测试代码,让自己可以在出错的时候获取某些必要信息,看看究竟是那里出错。
如果是线条同步冲突,可以试着用临界区、互斥、信号量等等方式;
如果是和主线程冲突,看看是否在线程中不恰当的使用了VCL控件(大部分VCL控件均不保证线程安全);