1

我需要对备忘录中的文本进行数学计算。[文件大小:~2mb]

一个合适的例子是我需要解码的编码文本。

我将备忘录文本传递给一个字符串以便对其进行解码。我想使用线程运行我的解码功能会更快。但经过一番谷歌搜索后,我没有找到适合我目的的好例子。

示例函数:

function entr_base_N(my_text:String):String;
var
    ts_hamil64:Integer;
begin
    For ts_hamil64 := 1 to Length(my_text) do
    begin
         Result:= Result + Chr(Ord(my_text[ts_hamil64])+10)
    end;    
end;
.....
.....
Memo1.Text:=entr_base_N(Memo1.Text)

我想把工作分成小块,平均分配工作,比如说 3..8 个线程并将我的解码功能分配给这些线程。你能指导我吗?

当前处理文本文件的时间:~35 秒。谢谢你的热心帮助。

4

2 回答 2

5

线程不是问题。您的函数entr_base_N会立即运行。在调试器中尝试。你会发现它根本不需要时间。在现代计算机上处​​理 2MB 的字符串是微不足道的。也就是说,我总是建议在可能的情况下预先分配一个返回缓冲区。

所有时间都花在将结果字符串发送回备忘录控件上。发生的事情是您将#13 和#10 字符转换为#23 和#20。无论出于何种原因,备忘录控件都不喜欢这样。在我看来,您发送回一个根本没有换行符的字符串,并且备忘录的自动换行代码表现不佳。

一个快速而肮脏的方法是WordWrapFalse你的备忘录上设置。

这里的重要教训是,您必须在尝试优化之前正确识别瓶颈。不过,这很容易落入陷阱,正如我最初为回答这个问题所做的努力所表明的那样。

于 2012-07-05T21:56:14.127 回答
1

要更快地分配到 Memo1.Text,您可以使用以下命令:

memo1.Perform(wm_setredraw, 0, 0);
try
  memo1.Text:= entr_base_N(memo1.Text);
finally
  memo1.Perform(wm_setredraw, 1, 0);
  memo1.invalidate;
end;
于 2012-07-14T16:43:03.360 回答