Multithreading mit List & Label

Gilt ab List & Label 15

List & Label kann in mehreren Threads gleichzeitig verwendet werden. Auf diese Weise können umfangreichere Druck-Aufgaben z.B. auf mehrere Prozessoren/Cores verteilt werden. Intern wird von diesen Möglichkeiten rege Gebrauch gemacht, z.B. bei der Druckvorschau im Designer oder beim DrillDown.

Bei der Verwendung in Multithread-Umgebungen sind einige Punkte zu berücksichtigen:

  1. Achten Sie darauf, dass ein List & Label Job (bzw. eine Komponenteninstanz) immer nur innerhalb des gleichen Threads verwendet wird. Die Erzeugung, Verwendung und Zerstörung des Jobs / der Komponente muss also im gleichen Thread stattfinden. Wenn Sie mehrere parallele Druckthreads starten möchten, muss also jeder dieser Druckthreads seinen eigenen Job öffnen und schließen. Hintergrund: Windows-GDI-Ressourcen wie Fensterhandles, Drucker-Devicekontexte etc. können nicht aus verschiedenen Threads verwendet werden.
    Hinweis: List & Label kann ab Version 27 auch unabhängig von Druckertreibern arbeiten (meist in Web Anwedungen etc.) und es kann dafür der Printerless-Modus aktiviert werden - siehe auch Unabhängig von Druckertreibern: Der neue Printerless-Modus in List & Label 27.
    Dafür muss die Option LL_OPTION_PRINTERLESS mit LlSetOption() für die API-Verwendung bzw. die Printerless-Eigenschaft der Komponenten im ersten Objekt/Schutzjob gesetzt werden. Eine Mischung von aktiviertem und deaktiviertem Printerless-Modus in den in der Anwendung verwendeten Jobs/Objekten wird nicht unterstützt und kann zu unerwartetem Verhalten führen.

  2. Stellen Sie sicher, dass Sie vor dem Start des ersten Threads einen sogenannten “Schutzjob” öffnen (bzw. eine Komponenteninstanz erzeugen) und diesen erst nach dem Beenden des letzten Threads wieder schließen. Typischerweise wird Ihre Applikation beim Start diesen Job erzeugen und beim Beenden wieder zerstören. Hintergrund: der erste Job erzeugt einige Hilfsobjekte, die im gleichen Thread wieder zerstört werden müssen. Zudem kann die Performance auf diese Weise deutlich verbessert werden, da ein häufiges Laden und Entladen der List & Label DLLs vermieden wird.

  3. Threads, die den Designer anzeigen, müssen das Single Threaded Apartment-Modell (STA) verwenden. Es dürfen also keine .NET Worker Threads aus dem Threadpool sein, da diese das Multi Threaded Apartment-Modell (MTA) verwenden. Hintergrund: für die Drag & Drop-Unterstützung im Designer muss OleInitialize() aufgerufen werden, was STA zwingend benötigt.

IDKBTD000795 KBTD000795