吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

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

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

[Delphi] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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, 2025-5-23 10:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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