AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Drucken mit ShellExecuteEx - Eigenes Programm wird träge
Thema durchsuchen
Ansicht
Themen-Optionen

Drucken mit ShellExecuteEx - Eigenes Programm wird träge

Ein Thema von APP · begonnen am 4. Apr 2003 · letzter Beitrag vom 5. Apr 2003
Antwort Antwort
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#1

Drucken mit ShellExecuteEx - Eigenes Programm wird träge

  Alt 4. Apr 2003, 11:54
Hallo,
ich drucke mit ShellExecuteEx viele unterschiedliche Dokumente nacheinader (in einer Schleife) aus, möchte nun aber, dass der User die Möglichkeit hat, das Ausdrucken zu unterbrechen.
Bei sehr großen Dokumenten reagiert meine Applikation aber sehr träge auf jeden Knopfdruck.

Hat da jemande eine Idee?

Delphi-Quellcode:
PROCEDURE TForm1.Button2Click(Sender: TObject);
VAR
  ShExecInfo : TShellExecuteInfo;
// alParam : ARRAY[0..99] OF Char;
  i : Integer;
BEGIN
  FOR i := 0 TO ListBox1.Items.Count - 1 DO
    BEGIN
      CloseIt := TRUE;
      IF NOT FileExists(ListBox1.Items.Strings[i]) THEN
        BEGIN
          MessageDlg('File: ' + ListBox1.Items.Strings[i] + ' not found', mtError, [mbOk], 0);
          Continue;
        END;
      FillChar(ShExecInfo, SizeOf(ShExecInfo), 0);
      WITH ShExecInfo DO
        BEGIN
          cbSize := SizeOf(ShExecInfo);
          fMask := SEE_MASK_NOCLOSEPROCESS; // SEE_MASK_NOCLOSEPROCESS OR SEE_MASK_FLAG_DDEWAIT;
          lpFile := PChar(ListBox1.Items.Strings[i]);
          lpVerb := 'print';
          nShow := SW_SHOW;
        END;
      IF ShellExecuteEx(@ShExecInfo) THEN
        BEGIN
          WaitForSingleObject(ShExecInfo.hProcess, 0);
          Application.ProcessMessages;
          IF CloseIt = FALSE THEN Exit; // Wird vom ExitButton False gesetzt
        END
      ELSE
        ShowMessage('Fehler beim Öffnen');
      Application.ProcessMessages;
    END;
  showMessage('Ready');
END;
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2
  Alt 4. Apr 2003, 12:11
Du könntest Threads benutzen: Die Benutzersteuerung läuft im Hauptthread unnd der Druck-Vorgang in einem eigenen Thread.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#3
  Alt 4. Apr 2003, 17:45
Tja, scheint eine gute Idee zu sein, habe aber mit Threads noch nichts am Hut, könntest Du ein paar Code-Schnipsel posten?
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 4. Apr 2003, 17:59
Code-Schnipsel zu Threads? Das sind nicht nur ein, zwei Zeilen. Aber bei Delphi ist im Demo-Verzeichnis ein Threading-Demo da bei.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#5
  Alt 5. Apr 2003, 12:56
@Luckie,
aufgrund Deines Kommentars schließe ich daraus, dass es für mein Problem wohl keine andere (simplere) Lösung gibt. Insgeheim hatte ich gehofft, es gibt dazu irgendwelche API-Tricks oder Callbacks, o.ä., aber ich werde mir nun wohl die Demos zu Gemüte führen (müssen).
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 5. Apr 2003, 16:03
Moin Armin,

hier einmal ein, sehr einfaches, Beispiel zu TThread:

Delphi-Quellcode:
type
  TcsDownloadThread = class(TThread)
  private
    FsSource : string;
    FsDest : string;
  public
    constructor Create(const AsSource : string; const AsDest : string);
    procedure Execute; override;
  end;

constructor TcsDownloadThread.Create(const AsSource, AsDest: string);
begin
  FsSource := AsSource;
  FsDest := AsDest;
  FreeOnTerminate := true; // Thread freigeben, wenn beendet
  inherited Create(false); // False = sofort starten
end;

procedure TcsDownloadThread.Execute;
begin
  URLDownLoadToFile(nil,PChar(FsSource),PChar(FsDest),0,nil); // Datei herunterladen
  Terminate; // dann beenden
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#7
  Alt 5. Apr 2003, 17:10
@Chris,
vielen Dank für Dein Beispiel, währenddessen habe ich den Holzhammer ausgepackt und erhöhe mal während der ShellExecuteEx-Phase die Proirität meines Programms:

Delphi-Quellcode:
         SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
         TRY
            IF ShellExecuteEx(@ShExecInfo) THEN
               BEGIN
                  aHandle := ShExecInfo.HProcess;
                  WaitForSingleObject(ShExecInfo.hProcess, 0);
                  Application.ProcessMessages;
                  IF CloseIt = FALSE THEN
                     BEGIN
                        CloseHandle(aHandle);
                        Exit;
                     END;
               END
            ELSE
               ShowMessage('Fehler beim Öffnen');
            Application.ProcessMessages;
         FINALLY
            SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);
         END;
Es scheint zu funktionieren, allerdings werde ich Dein obiges Beispiel aufnehmen und mal versuchen anzupassen, da Deine Lösung (und Chewies Idee mit den Threads) natürlich viel eleganter ist!
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#8
  Alt 5. Apr 2003, 18:13
@Chris,
Dein Code-Schnipsel war genau das Richtige!

Ich habe ihn ein bißchen zum Spielen umgebaut -und siehe da es funktioniert

Vielen Dank nochmal!
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 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