gpt4 book ai didi

Delphi 无法正确终止 I/O 进程

转载 作者:行者123 更新时间:2023-12-03 18:30:56 25 4
gpt4 key购买 nike

Delphi 没有写最后几行。一个过程调用 writeToText(a1, a2, ...)对于每一行。

type
TQuerySQL = class
public
Constructor Create;
Destructor Destroy; override;
procedure writeToText( plate:String; positionNo:String; newOdometer:String; oldOdometer:String);
end;

var
tconnect : TADOConnection;
tquery : TADOQuery;
F_Text: TextFile;

implementation

Constructor TQuerySQL.Create;
begin
AssignFile(F_Text, 'results.txt');
ReWrite(F_Text);
tquery := TADOQuery.Create(nil);
tconnect := TADOConnection.Create(nil);
tconnect.Close;
tconnect.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=SOFT20150911;';
tconnect.ConnectOptions := coConnectUnspecified;
tconnect.LoginPrompt := False;
tconnect.Open;
ShowMessage('starting');
end;

Destructor TQuerySQL.Destroy;
begin
tquery.Close;
tquery.Free;
tconnect.Close;
tconnect.Free;
CloseFile(F_Text);
ShowMessage('finished in destructor');
inherited Destroy;
end;

procedure TQuerySQL.writeToText( plate:String; positionNo:String; newOdometer:String; oldOdometer:String );
begin
Write(F_Text, 'UPDATE POSITIONS SET');
Write(F_Text, ' ODOMETER = '+oldOdometer);
Write(F_Text, ' WHERE');
Write(F_Text, ' LABEL = '''+plate+'''');
Write(F_Text, ' AND POSITIONNO = '''+positionNo+'''');
Write(F_Text, ' AND ODOMETER = '+newOdometer+';');
WriteLn(F_Text);
end;
样本输出:

UPDATE POSITIONS SET ODOMETER = 904068,1 WHERE LABEL = '34 XXX 11' AND POSITIONNO = '12110126'AND ODOMETER = 904092,2;

UPDATE POSITIONS SET ODOMETER = 904068,1 WHERE LABEL = '01 AL 101'AND POSITIONNO = '165556'AND ODOMETER = 904092,2;

UPDATE POSITIONS SET ODOMETER = 904148,7

最佳答案

也许您的代码的某些部分访问了 F_Text TQuerySQL 外部的变量介于 Create 之间的类和 Destroy来电。

如果同时运行多个 TQuerySQL 类的实例,也会发生同样的情况。只要F_Textvar 中声明单元的部分。

如果没有理由发生这种情况,您可以考虑将其设为 private :

type
TQuerySQL = class
private
F_Text: TextFile;
public
Constructor Create;
Destructor Destroy; override;
procedure writeToText( plate:String; positionNo:String; newOdometer:String; oldOdometer:String);
end;

这同样适用于:
tconnect : TADOConnection;
tquery : TADOQuery;

为了确保不会在同一个单元中发生错误,您还可以考虑添加 strict private 的关键字类的部分。

除了上述之外,执行除在析构函数中释放的对象之外的任务通常被认为不是一个好习惯。

我的建议是考虑使用额外的公共(public)方法来执行关闭操作并让析构函数完成它的工作。
public
procedure writeToTextClose;

. . .
procedure TQuerySQL.writeToTextClose;
begin
CloseFile(F_Text);
tquery.Close;
tconnect.Close;
ShowMessage('write to text finished');
end;

destructor TQuerySQL.Destroy;
begin
tquery.Free;
tconnect.Free;
inherited;
end;

任务可以这样完成:
var
qSql: TQuerySQL;

. . .

qSql := TQuerySQL.Create;
try

try
//here multiple calls to writeToText take place
qSql.writeToText(a1, a2, ...);

finally
//ensure CloseFile(F_Text) at least
qSql.writeToTextClose;
end;

finally
//ensure objects freeing
qSql.Free;
end;

关于Delphi 无法正确终止 I/O 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32626530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com