当前位置:主页>仓库管理软件> 列表

多线程操作数据库出现的问题? 找会计电算化软件下载

进销存软件版1楼: IH 到 ORACLE
采取多线程处理方式,在主进程上进行数据操作时,会出现以下两个错误。
1〉应用程序与调用一个已为另一个线程整理的接口。
2〉在异步运行时,操作不能进行

线程原码如下

unit URealTimeThread;

interface

uses
Windows,Classes,DB,ADODB,ComCtrls,cxDateUtils,SysUtils,
Messages,StdCtrls;

type

TrealTimeIHData = class(TThread)
private
procedure UpDataRealTime;
protected
procedure Execute; override;
public
constructor create(suppont:Boolean);
end;

implementation

uses Upublic, un_main;


constructor TrealTimeIHData.create(suppont:Boolean);
begin
inherited Create (Suspended);
FreeOnTerminate:=True;
end;


procedure TrealTimeIHData.Execute;
begin
try
UpDataRealTime
except

end;
end;

procedure TrealTimeIHData.UpDataRealTime;
var
Adorealtime_IH,Adorealtime_oracle:TADOQuery;
sqlstr:WideString;
lvtemp:TListItem;

procedure DealClear_Realtimedata();
begin
with Adorealtime_oracle do
begin
Close;
SQL.Clear;
sql.Text:=''delete from UPDATA_HGNYW_REAL '';
ExecSQL;
end;
with Adorealtime_oracle do
begin
Close;
SQL.Clear;
sql.Text:=''select * from UPDATA_HGNYW_REAL where 1<>1'';
Open;
end;
end;
begin
sqlstr:='' select ihtags.collectorgeneral2,ihtags.collectorgeneral4,ihtags.engunits, ihtags.collectorgeneral3,ihtags.hiengineeringunits,ihtags.description,tagname,timestamp,value from ihrawdata,ihtags '';
sqlstr:=sqlstr+'' where samplingmode=currentvalue and tagname not like ''''HGNYW*_SUM'''' and ihtags.comment like ''''HGNYW*'''' '';
sqlstr:=sqlstr+'' and ihtags.tagname=ihrawdata.tagname and timestamp>now-1m order by ihtags.collectorgeneral3,ihtags.description '';
try
Adorealtime_oracle:=TADOQuery.Create(nil);
if not frm_main.conSS.Connected then frm_main.conSS.Connected:=True;
Adorealtime_oracle.Connection:=frm_main.conSS;
Adorealtime_oracle.CursorType:=ctStatic;
Adorealtime_oracle.LockType:=ltBatchOptimistic;

Adorealtime_IH:=TADOQuery.Create(nil);
if not frm_main.conIH.Connected then frm_main.conIH.Connected:=True;
Adorealtime_IH.Connection:=frm_main.conIH;
Adorealtime_IH.CursorType:=ctStatic;
with Adorealtime_IH do
begin
Close;
sql.Clear;
sql.Add(sqlstr);
try
try
Open;
except
end;
DealClear_Realtimedata;
while not Eof do
begin
Adorealtime_oracle.Append;
Adorealtime_oracle.FieldByName(''tagname'').AsString:=Adorealtime_IH.fieldbyname(''tagname'').AsString;
Adorealtime_oracle.FieldByName(''dati'').Value:=Adorealtime_IH.fieldbyname(''timestamp'').Value;
Adorealtime_oracle.FieldByName(''tagmc'').AsString:=Adorealtime_IH.fieldbyname(''description'').AsString;
Adorealtime_oracle.FieldByName(''tagvalue'').AsFloat:=Adorealtime_IH.fieldbyname(''value'').AsFloat;
Adorealtime_oracle.FieldByName(''unit'').AsString:=Adorealtime_IH.fieldbyname(''engunits'').AsString;
Adorealtime_oracle.FieldByName(''property'').AsString:=Adorealtime_IH.fieldbyname(''collectorgeneral3'').AsString;
Adorealtime_oracle.FieldByName(''zone'').AsString:=Adorealtime_IH.fieldbyname(''collectorgeneral4'').AsString;
Adorealtime_oracle.FieldByName(''kind'').AsString:=Adorealtime_IH.fieldbyname(''collectorgeneral2'').AsString;
Adorealtime_oracle.FieldByName(''hiengineeringunits'').Value:=Adorealtime_IH.fieldbyname(''hiengineeringunits'').Value;
Next;
end;
Adorealtime_oracle.UpdateBatch();
except
lvtemp:=frm_main.lv1.Items.Add;
lvtemp.Caption:=DateTimeToText(now);
with lvtemp.SubItems do
begin
Add(''实时数据库倒入本地ORACLE失败'');
Add(''操作失败!'');
end;
end;
end;
finally
FreeAndNil(Adorealtime_IH);

FreeAndNil(Adorealtime_oracle);
end;
end;


end.

2楼: 啊,很简单,ADO是非线程安全的,你在procedure TrealTimeIHData.Execute;
begin
try
UpDataRealTime
except

end;
end;
的时候没有同步!!! 如会计电算化软件下载

3楼: 要加上Synchronize(UpDataRealTime)

4楼: 我做过了,还是不成!

5楼: procedure TrealTimeIHData.Execute;
begin
CoInitialize(nil);
FADOQuery:= TADOQuery.Create(nil);

try
while (not Terminated) do
begin
if (not Terminated) then Synchronize(MainFrmGUIOperation);
// Database Operation
......

end;

finally
CoUninitialize;
FreeAndNil(FADOQuery);
end;
end;

6楼: 兄弟,全部情况是这样的,我把线成创建放在了一个时间控件中,目的是每隔一段时间执行一段线程程序,我快崩溃了,请哪位指点一下

进销存软件版7楼: 线程内部的对vcl的操作应该全部用Synchronize同步起来

8楼: 这个帖子那位大虾一定全面解决一下,ADO是非线程安全的。

9楼: CoInitialize(nil);
try
while (not Terminated) do
begin
if (not Terminated) then
begin
CountThreat:=True;
UpDataRealTime;
CountThreat:=False;
end;
end;
finally
CoUninitialize;
CountThreat:=False;
end;

这是我将线成程序执行代码的更改。但关闭主进程时,又出现了同步的问题

10楼: 关闭主程序时出现这个问题?
不能同步,请哪位大虾解释