小编pop*_*p32的帖子

我什么时候应该使用关键部分?

这是交易.我的应用程序有很多线程做同样的事情 - 从大文件(> 2gb)读取特定数据,解析数据并最终写入该文件.

问题是,有时可能会发生一个线程从文件A读取X并且第二个线程写入同一文件A的X.会出现问题?

I/O代码对每个文件使用TFileStream.我将I/O代码拆分为本地(静态类),因为我担心会出现问题.由于它是分裂的,应该有关键的部分.

下面的每个案例都是未实例化的本地(静态)代码.

情况1:

procedure Foo(obj:TObject);
begin ... end;
Run Code Online (Sandbox Code Playgroud)

案例2:

procedure Bar(obj:TObject);
var i: integer;
begin
  for i:=0 to X do ...{something}
end;
Run Code Online (Sandbox Code Playgroud)

案例3:

function Foo(obj:TObject; j:Integer):TSomeObject
var i:integer;
begin
  for i:=0 to X do
    for j:=0 to Y do
      Result:={something}
end;
Run Code Online (Sandbox Code Playgroud)

问题1:在哪种情况下我需要关键部分,以便在> 1个线程同时调用它时没有问题?

问题2:如果线程1从文件A读取X(条目)而线程2写入X(条目)到文件A,是否会出现问题?

我什么时候应该使用关键部分?我试着把它想象成我的脑袋,但它很难 - 只有一个线程:))

编辑

这适合它吗?

{每2GB文件的一个类}

TSpecificFile = class
  cs: TCriticalSection;
  ...
end;

TFileParser = class
  file :TSpecificFile;
  void Parsethis; void ParseThat....
end;

function Read(file: TSpecificFile): TSomeObject;
begin
  file.cs.Enter;
  try
    ...//read …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading synchronization critical-section

5
推荐指数
2
解决办法
4163
查看次数

我是否需要在初始化时将setLength设置为动态数组?

type Tmyclass = class(TObject)
  somearray: array of TSometype
  FBool: Boolean;
  Fint: Integer;
  Fstr: string;
  constructor Create;
  destructor Destroy; override;
end;

implementation

constructor Tmyclass.Create;
begin
  inherited;
  SetLength(somearray,0); //is this needed?
end;

destructor TmyClass.Destroy;
begin
  SetLength(somearray,0); //this IS needed!
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

还有什么类型在创建时初始化?例如我在课堂上宣布的内容.FBool被保证是假的吗?是FInt保证是0吗?是Fstr保证是''?

当地情况怎么样?只有字符串?

我使用Delphi XE.

delphi delphi-xe

3
推荐指数
4
解决办法
5173
查看次数

函数的结果是否始终初始化?

可能重复:
Delphi中Result的默认值是什么

此问题类似,我现在问以下问题.

function Test:Boolean;
begin end;
Run Code Online (Sandbox Code Playgroud)

结果值是否总是保证为假(0)?整数值不是,布尔值也是如此?

delphi types

3
推荐指数
1
解决办法
1930
查看次数