2016-04-20 3 views
-3

Ich arbeitete in letzter Zeit an einem Programm. Das Programm extrahiert alle Frames aus einem Video und verarbeitet sie dann alle ... Nut, in der Verarbeitung Teil, es ist viel zu langsam, so dachte ich, diese Verarbeitungsfunktionen parallel zu laufen ...Multithread String Funktion

Aber wie ich ' Ich bin neu in Delphi und habe keine Erfahrung mit Multithreading, ich hatte gehofft, dass jemand es würde. Hier

ist die Funktion, die ich zur Zeit mit:

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

Der Code, den Sie geschrieben haben macht keinen Aufwand, irgendetwas in Threads zu tun, und da alle Arbeiten von einer externen Anwendung erledigt werden, ist es sehr unwahrscheinlich, dass Threads helfen. Höre einfach auf, auf die externe App zu warten und lasse mehrere Instanzen davon laufen. –

+0

Nun, diese Instanzen zu verschiedenen Kernen zu übergeben kann die Geschwindigkeit viel zu schön verbessern ... Wie es dauert 10 Minuten, um 80K Dateien zu verarbeiten ... Aber wenn es auf 8 Kernen läuft ... Ich schätze, es kann es in 1-2 tun min – Zenith

+0

Es wird nichts helfen, weil die Verzögerung in der Warte auf die externe App ist. Spawn stattdessen 8 Instanzen der externen App. Es gibt keinen Vorteil, wenn Sie irgendetwas in dem Code, den Sie gepostet haben, multi-threading-fähig machen, und wenn Sie anders denken, werden Sie sehr enttäuscht sein. –

Antwort

1

Was ich vorschlagen, ist
1. Verwenden Sie Createprocess packjpg.exe auszuführen, wird dies sofort ausführen und Sie werden nicht um warten um es zu beenden.
2. createProcess gibt eine TProcessInformation zurück, die Sie in einer Liste speichern müssen.
3. Führen Sie dies für jede Datei durch, die Sie verarbeiten möchten.
4. Sie haben jetzt die Dateien, die gleichzeitig verarbeitet werden, und eine Liste von TProcessInformation.
5. Schleife durch die Liste der TProcessInformation gehalten Sie bis sich das gesamte Verfahren abgeschlossen sind, mit: WaitForSingleObject(aProcessInformationRecord.hProcess, INFINITE);

Sie Dinge wie maximale Anzahl der laufenden Prozesse optimieren können, etc ...

+1

Einverstanden, was ich in meinen Kommentaren zum OP gesagt habe. Und was (um auf das OP hinzuweisen) ist nicht * Multi-Threading *. –

+0

Können Sie mir bitte seinen Code zur Verfügung stellen Sir ... Wie ich Multithreaded Programmierung völlig neu bin ... – Zenith

+0

Hier ist ein Link zu einer Frage mit Antworten dazu http://stackoverflow.com/questions/18013251/delphi- createprocess-execute-multiple-commands – RoutineOp