Drucken über API / Druckende abfragen(?)

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Drucken über API / Druckende abfragen(?)

Beitrag von notloesung »

Hallo,

ich drucke aus einer Xbase Anwendung 1 - x Dateien über die API Funktion auf den Standarddrucker.

Code: Alles auswählen

******************************************************************************
FUNCTION RunDefaultShellProg( cFile, cMode, nShow )
 * Ein Standardprogramm öffnen oder über ein Standardprogramm drücken
 * Parameter: cFile -> Datei welche geöffnet oder gedruckt werden soll
 *            cMode -> SHELL_OPEN  für Datei öffnen
 *                  -> SHELL_PRINT für Datei drucken
 *            nShow -> SW_MAXIMIZE
 *                  -> SW_MINIMIZE
 * Return   : NIL
******************************************************************************

   LOCAL  nRet := 0

   DO CASE
      CASE cMode == SHELL_PRINT
         // Druck im Hintergrund starten
         nRet := WinAPIPrint( cFile, , , nShow )
         IF ! (nret > 32)
            MsgBox( ... )
         ENDIF

      CASE cMode == SHELL_OPEN
	 ...
   ENDCASE

RETURN NIL
Die Druckaufträge (es können 1 aber auch 40 sein, meist sind es so 10-15) schicke ich in einer Schleife hintereinander ab. Und da ist schon das Problem.

Auf meinem Rechner kann ich die Druckaufträge einfach hintereinander los schicken. Auf meinem Laptop brauche ich unbedingt eine Pause zwischen dem "Abfeuern" der Druckaufträge. Es müssen so ca. 5 Sec. sein - ansonsten "verschluckt" sich der Druck und es werden von z.B. 15 Druckaufträgen nur 5 gedruckt.

Es scheint so zu sein, dass das ganze Rechner- / Hardwareabhängig ist (das habe ich zumindest bis jetzt beobachtet). Langsamer Rechner = größere Pause zwischen den Druckaufträgen, schneller Rechner = kürzere (bis keine) Pause.

Es ist natürlich absolut unproduktiv (und nicht sicher) eine feste Pause zwischen den Druckaufträgen einzubauen. Deshalb frage ich mich ob ich nicht den Druckstatus abfragen kann(?)
Im Prinzip das selbe Vorgehen wie bisher nur mit dem Unterschied dass ich nach jedem Druckauftrag abwarten will das dieser ausgeführt ist bevor ich nächsten abschicke. Ist das irgendwie möglich?

Gruß,
Notloesung
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

ein Verschlucken konnte ich bei mir mit den normalen Xbase++ Befehlen nie feststellen.

Jetzt bin ich einem Irrtum aufgessessen ;-)

Du druckst was anderes aus. Wahrscheinlich ist die Ladezeit von z.B. Word auf manchem Rechner so langsam, dass was vorloren geht. Aber warum sollen 1 bis 3 Sekunden Wartezeit zwischen den Druckaufträgen eine Verzögerung darstellen ?

Der ausführende Drucker braucht länger zum Drucken, insbesondere wenn er noch aufheizen muss.
Gruß
Hubert
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

... das habe ich vergessen ...

Mit dem Druck konvertiere ich PDF Dateien in TIFF.
Ich drucke also nicht aus.

Das Problem mit der Wartezeit ist, dass diese vom Rechner zu Rechner unterschiedlich ist.
Laufen auf einem langsameren Rechner noch andere Anwendungen, so kann es sein dass die Pause entsprechend länger ausfallen muss.
Daher würde ich gerne dynamisch darauf reagieren wollen.
Druck abschicken, auf das Druckende warten und erst dann weiter machen ...

Gruß,
Notloesung
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

notloesung hat geschrieben: Druck abschicken, auf das Druckende warten und erst dann weiter machen ...
was hast du denn für den Parameter

* nShow -> SW_MAXIMIZE
* -> SW_MINIMIZE

eingestellt ? Versuche es mal mit SW_MAXIMIZE dann müsste er abwarten bis das Dokument gedruckt ist. Natürlich kommt das auch auf die Anwendung an, die das umwandelt ...
Gruß
Hubert
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

Tach,

bin wieder da. Habe mir gestern den PC komplett abgeschossen :evil:

Ob nShow -> SW_MAXIMIZE oder SW_MINIMIZE das scheint nichts zu ändern.
Habe jetzt den Adobe Reader 8.1.0 installiert. Das scheint sich schon mal was verändert zu haben.
Jetzt kann ich z.B. 40 Druckaufträge hintereinander anschicken (ohne Wartezeit dazwischen) und in 95% der Fälle werden alle auch sauber gedruckt / konvertiert. Nur manchmal - aus welchen Grund auch immer - fehlen plötzlich welche. Mal 1 mal 3, etc.
Woran kann das wohl liegen? Und wie kann ich es beheben?

Gruß,
Notloesung
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wenn es um Acrobat Reader geht, würde ich dir empfehlen RUNSHELL mit Parametern zu benutzen. Hier meine Antwort auf deine damalige Anfrage:
brandelh hat geschrieben:Hi,

hier habe ich auch einige Infos zum Drucken auf bestimmten Druckern gefunden, (mehr als eigene Gedanken Stütze ;-) ):
In der Developers FAQ steht in etwa:

How To: Drucken aus der Commandozeile:

Wie in der 'Acrobat Developer FAQ' dokumentiert dient der Paramter /t dem direkten Drucken:

Drucken auf einem Netzwerkdrucker mit Druckertreiber und IP-Adresse:

Code: Alles auswählen

AcroRd32.exe /t "C:\test.pdf" "\\servername\printername" "AdobePS Tektronix Phaser 840" "123.45.678.910"
oder auch nur auf den Drucker ohne Treibername und ohne IP:

Code: Alles auswählen

AcroRd32.exe /t "C:\test.pdf" "\\servername\printername"
und hier stehen diese Infos:

http://support.adobe.com/devsup/devsup. ... /52080.htm

ich hatte einmal ein PDF mit anderen Parametern, dieses ist aber nicht mehr verfügbar.
ich würde aus den Dateinamen ein CMD Datei bauen und direkt (Aufruf per Hand) prüfen ob sie funktioniert. Danach würde ich diese CMD Datei aus RunShell sichtbar starten und sehen was passiert. Wenn das ohne Fehler passiert ist, dann kann man das Fenster auch verstecken.

Eine andere Idee wäre es, zu prüfen ob die TIF Datei vorhanden ist.
Du gibst doch den Namen vor oder ?
Wenn er fehlt die fehlenden nochmals beauftragen ...
Gruß
Hubert
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

brandelh hat geschrieben:Eine andere Idee wäre es, zu prüfen ob die TIF Datei vorhanden ist.
Du gibst doch den Namen vor oder ?
Wenn er fehlt die fehlenden nochmals beauftragen ...
Das mache ich eigentlich schon.
Bsp.:
Ich schicke 40 Druckaufträge los. (Alle hintereinander ohne Wartepausen.)
Danach starte ich einen Thread der prüft ob alle Dateien gedruckt/konvertiert wurden. Sobald alle gedruckt wurden, läuft das Programm weiter.
Das Problem ist nur, wie stelle ich fest das nichts mehr gedruckt wird. Das Drucken dauert ja immer unterschiedlich lange. Abhängig von der Hardware, von dem was auf dem Rechner sonst noch so läuft, von der Anzahl der Dateien und von deren Größe.

Gruß,
Notloesung
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

notloesung hat geschrieben:Das Problem ist nur, wie stelle ich fest das nichts mehr gedruckt wird.
Kann ich denn irgendwie den Spooler abfragen?

Notloesung
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

unter DOS Zeiten konnte man das, warum soll es unter windows in der API keine Funktion dazu geben ? Ich kenne sie aber nicht.

Nur warum druckst du 40 auf einmal um dann zu warten,
drucke doch immer eines und warte bis die Datei da ist, dann versuchst du diese Datei umzubenennen (FRename()), solange gedruckt wird, ist die Datei offen und du erhälst einen Fehler (Zugriff verweigert):

Etwa so:

Code: Alles auswählen

    aPDF := ????
    cTiff  := ""
    nAnz := len(aPDF)
    for x := 1 to nAnz
         // ich gehe von temporärem Namen aus,
         // ansonsten den richtigen aus Array nehmen
         if FExists("TIFF_TEMP.TIFF")
            FErase("TIFF_TEMP.TIFF")
         endif
         // TIFF Name bilden  
         if right(upper(aPDF[x]),4)=".PDF"
            cTiff := left(aPDF[x],len(aPDF[x])-4)+".TIFF"
         else
            cTiff := aPDF[x]+".TIFF"
            aPDF[x] := aPDF[x]+".PDF"
         endif
         // so nun kann man eine drucken, hier muss dein Befehl stehen.
         PrintPDF(aPDF[x], "TIFF_TEMP.TIFF")
         sleep(100)
         nVersuche := 10
         do while 0 <> FRename("TIFF_TEMP.TIFF",cTiff)
             if nVersuche <= 0
                 x--   // diese Datei nochmals
                 exit
             else
                 nVersuche--
             endif
             sleep(100)
         enddo
     next
  
Gruß
Hubert
notloesung
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 194
Registriert: Fr, 24. Feb 2006 8:09
Kontaktdaten:

Beitrag von notloesung »

Hallo Hubert,

danke für die Hilfe. Daraus sind noch ein paar Ideen entstanden...
Diese werde ich aber erst in ein paar Tagen/Wochen probieren,
denn in ca. 30 Min beginnt mein Urlaub :)

Gruß,
Notloesung
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

na da wünsche ich doch eine gute Erholung ... und Laptop zu Hause lassen :D
Gruß
Hubert
Antworten