吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 707|回复: 16
收起左侧

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

[复制链接]
冥界3大法王 发表于 2023-11-16 10:22
文件格式转换结果没问题,就是运行期间会假卡死状态。所以引出了今日的命题:

[Delphi] 纯文本查看 复制代码
procedure TForm7.Button1Click(Sender: TObject);
var
  i: Integer;
  文件名, 无扩展名的文件名: string;
begin
  for i := 0 to Memo1.Lines.Count - 1 do
  begin
//    ShowMessage(Memo1.Lines[i]);
    文件名 := Memo1.Lines[i];
    无扩展名的文件名 := StringReplace(ExtractFileName(文件名), '.docx', '', [rfReplaceAll, rfIgnoreCase]);
//    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
试试这个呢?
[Python] 纯文本查看 复制代码
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[i];

      // 检查文件是否存在
      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
@绿颜〃   经测试 就生成了一个文件,确实没卡死,不知为什么?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 18:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表