Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Probleme mit WritePrinter aus Thread (https://www.delphipraxis.net/197500-probleme-mit-writeprinter-aus-thread.html)

TurboMagic 10. Aug 2018 19:45

Probleme mit WritePrinter aus Thread
 
Hallo,

ich habe eine Delphi Anwendung die direkt ESC/POS Kommandos zum Drucker schickt. Bisher ging alles gut, bis ich gelesen habe, dass WritePrinter eine blockierende Anweisung ist und das dann in einen Thread verlagert habe. Seit dem wird nur noch Müll gedruckt.

Hat jemand eine Idee?
Delphi berlin, die zu druckenden Testdaten kommen sauber in der Drucken methode die über die Execute-Methode aufgerufen wird an.

Grüße

Turbomagick

p80286 10. Aug 2018 22:05

AW: Probleme mit WritePrinter aus Thread
 
Und das openprinter ist im gleichen thread?

Gruß
k-H

TurboMagic 11. Aug 2018 08:05

AW: Probleme mit WritePrinter aus Thread
 
Wie ich gerade sehe ist es das nicht. Das wird vorab mal "irgendwann" aufgerufen. Wenn ich später zum programmieren komme versuche ich mal, das in die Execute zu verlagern. Musds ich aber erst prüfen welche anderen Konsequenzen das hat.

TurboMagic 11. Aug 2018 10:00

AW: Probleme mit WritePrinter aus Thread
 
Habe jetzt das Open Printer testhalber in den Thread verlagert, Drucker druckt aber immer noch Schrott!
Ich ziehe mal die alte Drucken Unit aus der Quelltextverwaltung und probier's mal ohne Thread.

TurboMagic 12. Aug 2018 08:54

AW: Probleme mit WritePrinter aus Thread
 
So, Drucken wieder auf alten Stand mit Drucken aus VCL GUI Thread heraus umgestellt. Druck klappt wieder. Außerdem eben nochmal die These mit "Open Printer im Druck Thread aufrufen" getestet und wiederlegt.

Ich habe meine Unit kopiert und sowohl die Unit als auch die Klasse umbenannt. Dann im Hauptprogramm einen Testmenüpunkt zum Ausdruck des Testbons eingebaut und die Klasse auf TThread so umgestellt, dass diese suspended erzeugt wird (im Constructor wird das Druckerhandle besorgt!). Den Code aus der Testdruck Methode in die Execute verlagert und in der Testdruck Methode Start; aufgerufen.

Druckt prima und keinen Quatsch.

=> Besorgung des Handles via OpenPrinter muss nicht im thread selbst erfolgen
=> Mein Fehler muss woanders liegen, vermutlich in der Übergabe der Daten an den Thread, wobei die eigentliche Druckausgabe Routine sauber aussah. Mal sehen.

TurboMagic 13. Aug 2018 19:50

AW: Probleme mit WritePrinter aus Thread
 
So, nach dem ich es wieder auf die alte Fassung umgestellt hatte, damit das Druckern überhaupt funktioniert, bin ich es nochmals angegangen. Ich habe es jetzt erfolgreich auf Multithreaded umgestellt und OpenPrinter befindet sich nicht im Thread selbst.

Neumann 14. Aug 2018 06:51

AW: Probleme mit WritePrinter aus Thread
 
Warum überhaupt Drucken mit dieser Methode? Macht eigentlich nur noch Sinn wenn man alte Drucker mit seriellem Anschluss einsetzt.

Man kann bei Druckern mit "modernen" Schnittstellen wie USB oder Ethernet auch problemlos über den Windows-Druckertreiber drucken und die Bons z.B. mit Fastreports erstellen.

Das bringt dann viele Freiheiten bei der Gestaltung, wie Schriftart und Größe, Ränder, und weiteren Formatierungen sowie die Verwendung von Scripten im Report.

TurboMagic 15. Aug 2018 18:49

AW: Probleme mit WritePrinter aus Thread
 
Drucken mit dieser Methode kommt daher, dass das Programm ursprünglich auf einer Windows version laufen sollte für die es keinen Druckertreiber mehr gibt. Außerdem ist mir noch nicht klar, wie ich die Sonderfunktionen wie den Cutter aus FastReports bzw. mittels TPrinter basiertem Drucken benutzen kann.

Mit FastReports habe ich auch noch nicht viel gemacht (will ich ändern, Zeit ist aber auch immer ein Thema).
Ist es möglich in fastReports auch Reports zu erstellen, deren Daten nicht aus einer Datenbank oder einer In-memory Tabelle kommen?
Meine Daten liegen schließlich schon als Business Objete vor.

=> diese Version nochmal wie gehabt und jetzt funktioniert's ja auch wie gewünscht,
dann jedoch alternativ auswählbare Umsetzung mittels FastReports oder normalem Drucken.
Das muss auch mal Geschwindigkeitsmäßig getestet werden, da ich bisher "im Textmodus" drucken
kann, was recht schnell geht, Grafikdrucken (habe ich auch mal testhalber umgesetzt) im
Vergleich aber langsammer geht.

Grüße

TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz