能否用多线程解决程序 “输出效率”?
文件格式转换结果没问题,就是运行期间会假卡死状态。所以引出了今日的命题:{:301_974:}procedure TForm7.Button1Click(Sender: TObject);
var
i: Integer;
文件名, 无扩展名的文件名: string;
begin
for i := 0 to Memo1.Lines.Count - 1 do
begin
// ShowMessage(Memo1.Lines);
文件名 := Memo1.Lines;
无扩展名的文件名 := StringReplace(ExtractFileName(文件名), '.docx', '', );
// ShowMessage(无扩展名的文件名);
RichViewEdit1.LoadDocX(文件名);
RichViewEdit1.Format;
// sleep(500); 加不加 都无所谓,反正3秒转换输出一个
RichViewEdit1.SaveRVF('X:\0.用完明就删除\' + 无扩展名的文件名 + '.rvf', false);
end;
end; IO堵塞用多线程只能优化部分,想要最好解决IO堵塞建议使用异步,不过不清楚Delphi有没有异步这个概念,python是有的 15126819695 发表于 2023-11-16 11:33
IO堵塞用多线程只能优化部分,想要最好解决IO堵塞建议使用异步,不过不清楚Delphi有没有异步这个概念,pyth ...
还有个补充方法,就是多进程,这个也是不占用读写的,否则使用多线程的话,需要等其中一个进程完成了,才能进行下一个任务,多进程和异步是你在运行了我还是会开下一个任务
有没有磁盘映射相关API,采样磁盘映射API多线程分块读写是可以的,数据库文件类似原理。 给电脑加32g内存条啊 采用多线程效率肯定会提升 多线程是在流畅的模式下,电脑配置有富余时,增加运行的线程,提高效率 多线程能解决假死的问题。 试试这个呢?
procedure TForm7.Button1Click(Sender: TObject);
var
i: Integer;
文件名, 无扩展名的文件名: string;
begin
// 禁用界面响应
Button1.Enabled := False;
try
// 遍历 Memo1 中的每一行
for i := 0 to Memo1.Lines.Count - 1 do
begin
文件名 := Memo1.Lines;
// 检查文件是否存在
if FileExists(文件名) then
begin
无扩展名的文件名 := ChangeFileExt(ExtractFileName(文件名), '');
// 通过 TThread 创建一个独立的线程进行加载和保存操作
TThread.CreateAnonymousThread(
procedure
begin
// 加载文件
TThread.Synchronize(nil,
procedure
begin
RichViewEdit1.LoadDocX(文件名);
end
);
// 格式化和保存
TThread.Synchronize(nil,
procedure
begin
RichViewEdit1.Format;
RichViewEdit1.SaveRVF('X:\0.用完明就删除\' + 无扩展名的文件名 + '.rvf', False);
end
);
end
).Start;
end;
end;
finally
// 启用界面响应
Button1.Enabled := True;
end;
end;
@绿颜〃 经测试 就生成了一个文件,确实没卡死,不知为什么?
页:
[1]
2