2016-04-20 77 views
-3

最近我正在開發一個程序。程序提取從視頻的所有幀,然後處理他們... ...堅果,在加工環節,它的方式太慢,所以我想運行並行的處理功能...多線程字符串函數

但是,正如我在Delphi中是新的,並沒有多線程的經驗,我希望有人知道如何去做。

這裏是我目前使用的功能:

sl.loadfromfile(log); 
for i := 0 to (SL.Count div 2) - 1 do 
     begin 
      WriteLn('Processing extracted frames ' + IntToStr(i + 1) + 
      ' of ' + IntToStr(SL2.Count div 2)); 
      if FileExists(TempDir + IntToHex(i, 8) + '.jpg') then 
      ExecAndWait(SrcDir + 'packjpg.exe', AnsiRightStr(Str[2], 2) + ' ' + 
       '"' + TempDir + IntToHex(i, 8) + '.jpg' + '" "' + TempDir + 
       IntToHex(i, 8) + '.pjg' + '" , TempDir, true, true); 
     end; 
+0

你的代碼已經發布在線程中做任何事情都毫不費力,並且由於所有工作都由外部應用程序完成,所以線程將不太可能提供幫助。只需停止等待外部應用程序,並讓它的幾個實例運行。 –

+0

將這些實例傳遞給不同的內核可以提高速度的方式太好了......就像處理80K文件需要10分鐘......但是如果它運行在8個內核上......我估計它可以在1-2分 – Zenith

+0

它不會幫助任何事情,因爲延遲是在等待外部應用程序。一次產生8個外部應用程序的實例。在您發佈的代碼中對多線程任何內容進行多線程並沒有什麼好處,如果您覺得不然,您會感到非常失望。 –

回答

1

我的建議是
1.使用CreateProcess的執行packjpg.exe,這將立即執行,你會不會被周圍等待爲它完成。
2. createProcess返回一個TProcessInformation,您需要將其存儲在列表中。
3.爲每個要處理的文件執行此操作。
4.您現在正在同時處理文件和TProcessInformation的列表。
5.遍歷TProcessInformation的列表中,您一直保持到所有的進程完成後,使用:WaitForSingleObject(aProcessInformationRecord.hProcess, INFINITE);

你可以調整之類的當前進程等的最大數量...

+1

同意,我在評論中對OP說。哪些(指向OP)不是*多線程*。 –

+0

你能爲我提供的代碼,請先生......至於我完全新的多線程編程...... – Zenith

+0

繼承人鏈接到一個問題的答案該http://stackoverflow.com/questions/18013251/delphi- createprocess-execute-multiple-commands – RoutineOp