我有一個簡單的程序程序。轉換程序爲多線程,利用多核cpu
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;
現在我的新電腦有4cores,使得這一程序的多線程將使其運行速度更快(如果我使用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 - 使用線程。
我會報告回來。謝謝大家。
有一個簡單的方法來並行化代碼,看看我的答案。最大的問題是給名單上的專有名稱,以便每個人都能看到並理解該算法實際上在做什麼! – 2010-06-19 08:19:21
@Cosmin:代碼執行zword:= replace(zword,a,b,[all]),並沒有簡單的方法來並行化。 – gabr 2010-06-19 08:50:46
你不會並行化;您將第一個循環(經過文件名的循環)並行化。 – 2010-06-19 08:57:37