2016-04-20 24 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