Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在线程中读取INI文件而不占用CPU时间_Multithreading_Delphi_Ini - Fatal编程技术网

Multithreading 在线程中读取INI文件而不占用CPU时间

Multithreading 在线程中读取INI文件而不占用CPU时间,multithreading,delphi,ini,Multithreading,Delphi,Ini,如何在线程中读取.ini文件而不消耗如此多的CPU时间?线程将在运行时运行,这意味着while true不会延迟 搜索.ini上的值的代码为: var Leitura : TIniFile; begin Result := False; Leitura := TIniFile.Create('File.ini'); if Leitura.ValueExists('KEY', ValueToSearch) then Result := True; Leitura.Free

如何在线程中读取
.ini
文件而不消耗如此多的CPU时间?线程将在运行时运行,这意味着while true不会延迟

搜索.ini上的值的代码为:

var
  Leitura : TIniFile;
begin
  Result  := False;
  Leitura := TIniFile.Create('File.ini');

  if Leitura.ValueExists('KEY', ValueToSearch) then Result := True;

  Leitura.Free;

但是,由于此函数在无限循环中运行,它会消耗CPU时间,因此我需要解决此问题。

您可以使用API监视文件的更改,并仅在文件更改时检查值,而不是连续轮询.INI文件的更改。Delphi版本在单元
ShellCtrls.pas
中包含一个组件
TShellChangeNotifier
,它是API函数的包装器。此外,还有一篇文章介绍了如何使用WindowsAPI函数
ReadDirectoryChangesW
“检索描述指定目录内更改的信息”。DelphiJCL还包含一个组件,用于监视文件和目录的更改。在Torry上,您最终可以找到一个组件,该组件允许监视文件/目录的更改,并在发生更改时触发事件。

为什么要连续循环读取INI文件?您的高CPU使用率可能意味着您的线程在循环迭代之间不会向其他线程屈服。尝试在每次迭代中添加一个小的
Sleep()
。尽管你可能会考虑找到另一个不需要像任何线程一样连续读取INI文件的解决方案,如果它不睡至少几毫秒,那么正如里米所说,它将消耗整个CPU内核。在慢速磁盘上创建一个巨大的INI,如果控制器允许的话,禁用读缓存。然后,您可以用磁盘垃圾代替cpu使用率。或者,试着问这个问题。我通过阅读来检查.ini或no上是否存在一个键。这个例程用于检查windows句柄的循环,以确定某个特定句柄是否打开。ini或no。这不是你问题的解决方案。我已经用过他在粘贴上的其他解决方案。我将与他或IPC一起尝试。