gpt4 book ai didi

delphi - 利用多核cpu将程序转换为多线程

转载 作者:行者123 更新时间:2023-12-03 18:53:04 28 4
gpt4 key购买 nike

我有一个简单的程序,只有一个程序。

Procedure TForm1.btnKeywrdTransClick(Sender: TObject);
Var
i, ii : integer;
ch_word, zword, uy_word: widestring;
Begin
TntListBox1.items.LoadFromFile('d:\new folder\chh.txt'); //Chinese
TntListBox2.items.LoadFromFile('d:\new folder\uyy.txt'); //Uyword
TntListBox4.items.LoadFromFile(Edit3.text); //list of poi files
For I := 0 To TntListBox4.items.Count - 1 do
Begin
TntListBox3.items.LoadFromFile(TntListBox4.Items[i]);
zword := tntlistbox3.Items.Text; //Poi
For ii := 0 To TntListBox1.Items.count - 1 Do
Begin
loopz;
ch_word := tntlistbox1.Items[ii];
uy_word := ' ' + TntListBox2.items[ii] + ' ';
zword := wideFastReplace(zword, ch_word, uy_word, [rfReplaceAll]); //fastest, and better for large text
End;
TntListBox3.Items.text := zword;
TntListBox3.items.SaveToFile(TntListBox4.Items[i]);
end;
end;

现在我的新计算机具有4核,正在使该程序多线程化将使其运行速度更快(如果我使用4线程,则每个核一个线程)?
我没有多线程经验,需要您的帮助
谢谢。

ps:这是Loopz程序
Procedure loopz;
Var
msg : tmsg;
Begin
While PeekMessage(Msg, 0, 0, 0, pm_Remove) Do
Begin
If Msg.Message = wm_Quit Then Halt(Msg.WParam);
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
End;

更新1:
从答案,我会做

1-使用分析器查找最耗时的代码

2-尝试消除与gui相关的事情

3-使用线程。

我会报告。谢谢大家

最佳答案

首先,使算法尽可能有效地发挥作用:停止使用TListBox来存储数据!!! (抱歉),用TStringList替换它们,您会获得巨大的性能改进。无论如何,这都是必需的第一步,因为您不能使用来自多个线程的GUI对象(实际上,您只能在“主”线程中使用它们)。在将TListBox更改为TStringList时,请给变量赋予有意义的名称。我不知道周围有多少人知道您要在ListBox4中存储文件名列表,然后将ListBox1用作“关键字列表”,将ListBox2作为“值列表”来加载ListBox3中的每个文件...真的,这真是一团糟!这是使用TStringList和专有名称的样子:

Procedure TForm1.btnKeywrdTransClick(Sender: TObject);
Var
i, ii : integer;
ch_word, zword, uy_word: widestring;
PoiFilesList:TStringList; // This is the list of files that need work
PoiFile:TStringList; // This is the file I'm working on right now
KeywordList, ValueList:TStringList; // I'll replace all keywords with corresponding values
Begin

PoiFilesList := TStringList.Create;
PoiFile := TStringList.Create;
KeywordList := TStringList.Create;
ValueList := TStringList.Create;

try
PoiFilesList.LoadFromFile(Edit3.text); //list of poi files
KeywordList.LoadFromFile('d:\new folder\chh.txt'); //Chinese
ValueList.LoadFromFile('d:\new folder\uyy.txt'); //Uyword
For I := 0 To PoiFilesList.Count - 1 do
Begin
PoiFile.LoadFromFile(PoiFilesList[i]);
zword := PoiFile.Text; //Poi
For ii := 0 To KeywordList.count - 1 Do
Begin
ch_word := KeywordList[ii];
uy_word := ' ' + ValueList[ii] + ' ';
zword := wideFastReplace(zword, ch_word, uy_word, [rfReplaceAll]);
End;
PoiFile.text := zword;
PoiFile.SaveToFile(PoiFilesList[i]);
end;
finally
PoiFilesList.Free;
PoiFile.Free;
KeywordList.Free;
ValueList.Free;
end;
end;

如果现在看一下代码,很明显它是做什么的,而且很明显如何进行多线程处理。您有一个包含文件名的文本文件。您打开这些文件中的每个文件,并将所有关键字替换为相应的值。您将文件保存回磁盘。这简单!一次将KeywordList和ValueList加载到内存,将文件列表分成4个较小的列表,启动4个线程,每个线程都使用其自己的较小文件列表。

我不想纠缠代码的整个多线程变体,因为如果我自己写代码,您可能会不明白它是如何工作的。如果遇到麻烦,请给它一次机会并寻求帮助。

关于delphi - 利用多核cpu将程序转换为多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3074501/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com