冥界3大法王 发表于 2023-11-16 10:22

能否用多线程解决程序 “输出效率”?

文件格式转换结果没问题,就是运行期间会假卡死状态。所以引出了今日的命题:{: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;

15126819695 发表于 2023-11-16 11:33

IO堵塞用多线程只能优化部分,想要最好解决IO堵塞建议使用异步,不过不清楚Delphi有没有异步这个概念,python是有的

15126819695 发表于 2023-11-16 11:42

15126819695 发表于 2023-11-16 11:33
IO堵塞用多线程只能优化部分,想要最好解决IO堵塞建议使用异步,不过不清楚Delphi有没有异步这个概念,pyth ...

还有个补充方法,就是多进程,这个也是不占用读写的,否则使用多线程的话,需要等其中一个进程完成了,才能进行下一个任务,多进程和异步是你在运行了我还是会开下一个任务

No596 发表于 2023-11-16 13:01

有没有磁盘映射相关API,采样磁盘映射API多线程分块读写是可以的,数据库文件类似原理。

sai609 发表于 2023-11-16 13:08

给电脑加32g内存条啊

FruitBaby 发表于 2023-11-16 14:08

采用多线程效率肯定会提升

lyie15 发表于 2023-11-16 14:35

多线程是在流畅的模式下,电脑配置有富余时,增加运行的线程,提高效率

lovemit 发表于 2023-11-16 14:45

多线程能解决假死的问题。

绿颜〃 发表于 2023-11-16 16:25

试试这个呢?
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;

冥界3大法王 发表于 2023-11-16 17:59

@绿颜〃   经测试 就生成了一个文件,确实没卡死,不知为什么?
页: [1] 2
查看完整版本: 能否用多线程解决程序 “输出效率”?