Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Bilder komprimieren und speichern mit Threads

  Alt 28. Feb 2011, 18:37
Liebe Mitlesende,

ich stehe vor folgendem Problem und dabei ein bisschen auf dem Schlauch:

Gegeben ist ein Programm, dass über TDelphiTwain einen Seitenscanner ansteuert und pro Scan-Auftrag etwa 25 DIN-A4-Seiten als TBitmap geliefert bekommt. Der Scanner schafft ca. 45 Seiten/min.
Die TBitmaps werden zunächst jeweils in einer TObjectList abgelegt. Erst wenn das letzte Bild gescannt wurde, werden diese alle nacheinander beschnitten, größenangepasst, gedreht, ins PNG-Format komprimiert und dann gespeichert.
Das hat ein paar Nachteile: So belegt das Programm während des Scannes viel, viel Speicher, die CPU wird während des Scannens de facto nicht benutzt etc. pp.

Meine Idee war es daher, das ganze in Threads auszulagern. Allerdings habe ich Probleme damit, wie ich das logisch hinbekommen kann. Ich könnte jeweils einen Thread erzeugen, sobald das nächste Bild geliefert wird. Damit würde ich aber den PC heillos überlasten.
Ich müsste es daher hinbekommen, dass ich die Anzahl auf z.B. 10 beschränke. Wenn also 10 Threads gestartet sind, sollen weitere Bilder nach dem alten Muster wieder in eine Liste kommen. Ist ein Thread fertig (also wieder nur 9), soll ein neuer gestartet werden ...

Meine Fragen:
  1. Bringt das etwas? Unsere Arbeitsplatzrechner haben alle nur 1 CPU/1Kern.
  2. Wie mache ich das Grundsätzlich?
  3. Am einfachsten würde ich das wieder über die TObjectList machen, habe aber skrupel, diese aus dem Thread heraus anzufassen (Bild holen und nach dem Speichern löschen). Ich würde die Threads zählen. Fällt die Zahl unter 10, käme der nächste. Geht das so, wie muss ich das machen? Kann ich den Thread-Zähler aus dem Thread einfach so ändern?
  4. Ich würde die Threads wegen der besseren Lesbarkeit des Codes gern in eine separate Unit auslagern. Dann komme ich aber an die Liste mit den Bitmaps nicht heran und muss die TBitmaps mit übergeben, sodass 3. eigentlich ausscheidet, richtig?

Bitte auch gern Links, wo ich mich zu dem Thema belesen kann.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat