Seite 1 von 1

XbpPrinter hängt sich

Verfasst: Mi, 07. Aug 2013 20:22
von ramses
Bei einigen PC's habe ich das Problem dass XbpPrinter sporadisch bei der Methode create() hängt. Es ist dann nur noch Programmabbruch mit Alt-C möglich.

Code: Alles auswählen

 oDC := XbpPrinter():new() 
 oDC:create()  <-- Programm bleibt hier hängen
In der XppFatal steht dann:
  • FATAL ERROR LOG
    Abort with Alt-C
    SYS Thread-ID: 756
    Module: EVM
    Error Codes: EH: 11 Sub: 0(0) OS: 0 XPP: 0
    Call Stack of Thread 1 (568):
    U174DRUCKERAUSWAHL(370) --> Zeile mit oDC:create()
Das ganze läuft unter Windows 7 64 Bit, hat jemand eine Ahnung an was das Problem liegen könnte?

Gruss Carlo

Re: XbpPrinter hängt sich

Verfasst: Mi, 07. Aug 2013 23:17
von brandelh
gibt es einen gültigen Druckertreiber ?
Wenn ja, passiert es auch mit einem anderen Standarddrucker ?

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 8:06
von Herbert
Carlo,
mach nur das new() ohne create. Wenn die Antwort NIL ist, hast du keinen Drucker installiert.

Code: Alles auswählen

LOCAL aPrinters[0], oPrn
oPrn := XbpPrinter():new()
AADD(aPrinters,'Kein Drucker')
IF oPrn # NIL  // Druckerobject wurde erzeugt.
  aPrinters := oPrn:list()
ENDIF
return aPrinters

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 9:44
von ramses
Danke für die Tips, leider helfen diese nicht weiter....

Auf dem PC sind 3 Netzwerkdrucker (Freigabe von Server) sowie PDF-Creator installiert. Ich habe gestern alle 4 gelöscht und mit aktuellen Treibern neu installiert. Ohne Erfolg.

Merkwürdig ist dass ich z.B. 6 von 10 Dokumenten(einer Serie Packetzettel) drucken kann, beim 7. hängt das Programm in einer Zeile oDC:create() bezw. oDC:create( cDrucker )

Wärend das Programm hängt kann z.B. mit Word problemlos auf alle Drucker gedruckt werden, obwohl mein xBase Programm noch immer hängt.


Gruss Carlo

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 10:04
von brandelh
Machst du für jedes Dokument einen neuen Drucker auf und zerstörst den danach wieder ?

Warum ?

Es reicht doch das aktuelle Dokument zu beenden und mit dem neuen weiter zu machen.

Eventuell gibst du die Druckerresourcen beim Ende von XbpPrinter():destroy() nicht richtig frei ?

Hier habe ich mein Destroy:

Code: Alles auswählen

*-------------------------------------------------------------------
METHOD _HBPrinter:DestroyPS( oPS )
    LOCAL oDC := oPS:device() // oDC entspricht dem XbpPrinter()
    IF oDC <> NIL
       oPS:configure()
       if oDC:Status() = XBP_STAT_CREATE
          oDC:destroy()
       endif
       if oPS:Status() = XBP_STAT_CREATE
          oPS:destroy()
       endif
    ENDIF
RETURN SELF
PS: HBPrinter() wird nicht von XbpPrinter() abgeleitet, sondern entspricht eher einem PresentationSpace

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 12:38
von Rolf Ramacher
versuch es doch mal mit

XbpPrintDialog() - wo du den Drucker auswählst

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 13:33
von Herbert
Ich denke, Hubert, unser Super-Drucker-Spezialist, hat Recht. Am Ende des Druckjobs, falls nicht noch mehr zum Drucken folgt, muss das Objekt zerstört werden.

Code: Alles auswählen

    oPS:device():endPage()
    oPS:device():endDoc()
    DestroyDevice( oPS )
wobei oPS so entsteht:

Code: Alles auswählen

  oDC := XbpPrinter():New()  // Default - Printer nehmen
  oDC:Create( cPrinterObjectName )
... setzen Papiergrösse, Schacht, Orientierung...
  oPS   := XbpPresSpace():New()
...
  oPS:Create( oDC, aSizeP, GRA_PU_LOMETRIC )   // auf mm einstellen

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 13:59
von Jan
Wenn der Druckvorgang komplett abgeschlossen ist, dann mache ich eine Aufräumaktion:

Code: Alles auswählen

oDrucker:destroy()
oPS:destroy()
oDrucker := NIL
oPS := NIL
Damit fahre ich sehr gut. Vorher hatte ich ab und an auch mal merkwürdige Phänomene, aber mit dieser Kombination nie wieder.

Jan

Re: XbpPrinter hängt sich

Verfasst: Do, 08. Aug 2013 14:13
von brandelh
Zur Verdeutlichung ...

Man KANN ein Druckerobjekt erstellen und für mehrere Ausdrucke verwenden:

Code: Alles auswählen

oXbP steht für ein XbpPrinter() Objekt
oPS  steht für das zugeordnete PresentationSpaceObjekt
* 20 Dokumente drucken ...
oXbP und oPS erstellen und zuordnen ... (steht in Hilfe)
for x = 1 to 20 
    oXbP:StartDoc()
    // mach was
    oXbP:EndDoc() // kein :NewPage() vor EndDoc() ohne Text, sonst gibt es eine leere Seite !
next
* keine Ausdrucke mehr 
oXbP und oPS destroyen ! (steht auch in Hilfe)
das geht auch, dauert aber länger !!!

Code: Alles auswählen

oXbP steht für ein XbpPrinter() Objekt
oPS  steht für das zugeordnete PresentationSpaceObjekt
* 20 Dokumente drucken ...
for x = 1 to 20 
   oXbP und oPS erstellen und zuordnen ... (steht in Hilfe)
   oXbP:StartDoc()
   // mach was
   oXbP:EndDoc() // kein :NewPage() vor EndDoc() ohne Text, sonst gibt es eine leere Seite !
   oXbP und oPS destroyen ! (steht auch in Hilfe)
next
... keine Ausdrucke mehr 
aber so gehen einem schnell die Resourcen (Druckerhandles) aus, insbesondere auf einem TerminalServer

Code: Alles auswählen

oXbP steht für ein XbpPrinter() Objekt
oPS  steht für das zugeordnete PresentationSpaceObjekt
* 20 Dokumente drucken ...
for x = 1 to 20 
   oXbP und oPS erstellen und zuordnen ... (steht in Hilfe)
   oXbP:StartDoc()
   // mach was
   oXbP:EndDoc() // kein :NewPage() vor EndDoc() ohne Text, sonst gibt es eine leere Seite !
next
... keine Ausdrucke mehr 
und wer glaubt dass die 3. Art in einer Funktion nach dem ENDE dieser keine Probleme verursacht irrt.
Xbase++ räumt zwar SEINE Variablen (hier oXbp und oPS) auf, aber eben nicht die Betriebssystem handles, dafür ist destroy() nötig.

Re: XbpPrinter hängt sich

Verfasst: Mi, 14. Aug 2013 21:36
von ramses
Nach genauer Beobachtung haben wir herausgefunden dass der Hänger des Programms durchaus auch beim ersten Aufruf von oDC:Create() Auftritt.

Auch das vollstängige Entfernen und neuinstallieren aller Druckertreiber in der neuesten Version haben nichts gebracht.

Langsam kommt jetzt doch Verzweiflung auf .........

Gruss Carlo

Re: XbpPrinter hängt sich

Verfasst: Mi, 14. Aug 2013 22:10
von brandelh
und ihr habt geprüft, ob XbpPrinter():new() tatsächlich ein Druckerobjekt zurückgegeben hat ?

Re: XbpPrinter hängt sich

Verfasst: Do, 15. Aug 2013 9:09
von ramses
@Hubert

Nein, die Rückgabe wird nicht auf NIL geprüft. Wieso? Kann xbpPrinter():new() NIL zurückgeben!?

Gruss Carlo

Re: XbpPrinter hängt sich

Verfasst: Do, 15. Aug 2013 9:21
von brandelh
ja, das kann passieren, wenn ein Fehler auftritt. Daher immer NEW() von CREATE() trennen:

Code: Alles auswählen

LOCAL oPrn
oPrn := XbpPrinter():new() 
IF oPrn = NIL
    Fehlermeldung
ELSE
    // mit oPrn:List() könnte man die Liste der installierten Drucker ermitteln.
    // wenn man einen davon als Text an Create() übergibt, wird dieser statt dem Standarddrucker genutzt.
    oPrn:create() // für Standarddrucker
    ...
ENDIF
PS: bei meiner HBPrinter Klasse wird immer ein HBPrinter Objekt erzeugt, aber wie schon geschrieben ist diese Klasse nicht von XbpPrinter abgeleitet.

Re: XbpPrinter hängt sich

Verfasst: Do, 22. Aug 2013 9:29
von ramses
@Hubert

Hallo Hubert die Demo-Programme deiner Druckerklasse bleiben auch hängen ......

Gruss Carlo

Re: XbpPrinter hängt sich

Verfasst: Do, 22. Aug 2013 9:41
von Koverhage
Ich hatte die Probleme nur wenn kein Standarddrucker vorhanden ist, bzw. der Standarddrucker ein PDF Drucker war.

Re: XbpPrinter hängt sich

Verfasst: Do, 22. Aug 2013 10:27
von brandelh
Sind das lokale oder netzwerkdrucker ?

Meine Druckerklasse meldet übrigens auch Fehler, wenn die Druckerwarteschlange auf "angehalten" steht ... das muss nicht sein.

Bei Netzwerkdrucker sind jede Menge Fehler möglich, aber wenn aus dem Druckerdialog heraus eine Testseite gedruckt werden kann (also direkt vom Treiber/OS), dann sollte auch Xbase++ drucken können.

PS: nicht alle meine Beispiele räumen richtig auf :-( ... wenn man meine PrinterDialog nutzt, räumt der beim Schließen des Fensters auf, ansonsten müsste es da sein, aber bei kleinen Testprogrammen kommt eine solche Nachlässigkeit schon mal vor :wink:

Re: XbpPrinter hängt sich

Verfasst: Do, 22. Aug 2013 10:31
von brandelh
Lokale PDF Drucker sollten immer funktionieren, aber bei einem Terminalserverprogramm könnte eventuell der Bildschirm mit der Namensabfrage hinter das eigentliche Programm gerutscht sein oder gar nicht angezeigt werden ... alle Nachfragen sind da potentiell problemeatisch.

Re: XbpPrinter hängt sich

Verfasst: Di, 27. Aug 2013 13:39
von ramses
Hi

nachdem ich, aus purer Verzweiflung, auf dem Server bei allen Druckern den Hacken bei "Bidirektionale Unterstützung" entfernt habe ist das Problem nun seit 2 Tagen nicht mehr aufgetreten.


Gruss Carlo