Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WaitForSingleObject - GUI nicht ansprechbar (https://www.delphipraxis.net/123449-waitforsingleobject-gui-nicht-ansprechbar.html)

Rer 2. Nov 2008 09:52


WaitForSingleObject - GUI nicht ansprechbar
 
Hi @all, :)
ich bin grad dabei einen kleinen konverter zu schreiben der eigentlich nur eine konsolenanwendung mit parametern aufruft. Jetz kann der Benutzer auf den Button convert klicken und in einer Listbox wird er über den status konvertierung informiert (das mache ich weil man mehrere Datein am stück konvertieren können soll und es daher nützlicher is).
So nun rufe ich die Konsolenanwendung mit CreateProcess auf und warte mit WaitForSingleObject auf dessen Beendigung, aber während ich das mache ist mein GUI nicht ansprechbar und das ist eben auch schlecht bei mehreren datein die zu konvertieren sind weil erst ganz am ende die listbox aktualisiert wird.
Könnt ihr mir da weiterhelfen?
mfg
Rer

jfheins 2. Nov 2008 09:58

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Du könntest dier Arbeit in einen Thread auslagern - dann bleibt deine Anwendung weiterhin problemlos bedienbar.

Delphi-Referenz durchsuchenTThread ;)

peep 2. Nov 2008 10:20

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Oder setze in die Dateikonvertierungsschleife nach jeder Datei ein "MultiTasken" :oops:

Delphi-Quellcode:
procedure MultiTasken;
var
  M: TMsg;
begin
  if Peekmessage(M, 0, 0, 0, pm_Remove) then
  begin
    TranslateMessage(M);
    DispatchMessage(M);
  end;
end;

DeddyH 2. Nov 2008 10:21

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Diese "Multitasken"-Funktion gibt es in ähnlicher Form bereits als Application.ProcessMessages.

alzaimar 2. Nov 2008 11:25

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Zitat:

Zitat von Rer
...und warte mit WaitForSingleObject auf dessen Beendigung, aber während ich das mache ist mein GUI nicht ansprechbar ...

Irgendwie auch logisch, nicht?

Die Sache in einen Thread auszulagern ist schon eine Möglichkeit, allerdings wirst Du Dir noch Gedanken machen müssen, wie du die Ergebnisse in der GUI darstellst (die VCL ist nicht threadsicher).

Eine andere Möglichkeit wäre, dein 'WaitForSingleObject' mit einem Timeout von z.B. 200ms aufzurufen und dann mit Application.ProcessMessages dafür zu sorgen, das die GUI nicht einfriert. Großartige Aktionen wirst Du aber nicht ohne Weiteres ausführen können (Programm beenden, abbrechen etc.). 'Ohne Weiteres' bedeutet hier, das es schon geht, aber eben nur mit etwas Schmalz.

Delphi-Quellcode:
While WaitForSingleObject (MyHandle, 100) = WAIT_TIMEOUT Do
  Application.ProcessMessages;

jfheins 2. Nov 2008 11:32

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Da finde ich den Thread eleganter :mrgreen:

Visuelle Ausgabe geht ja über die synchronize() -Methode ohne allzuviel Aufwand, und man kann das Warten einfach abbrechen indem man den Thread beendet.

Das könnte dann ungefähr so aussehen:
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  while not Terminated do
  begin
    synchonize(GetNewJob);
    if {Job bekommen} then
    begin
      // Anwendung aufrufen und warten
      Output := ...;
      synchronize(JobDone);
    end
    else
      Suspend;
  end;
end;

Apollonius 2. Nov 2008 11:40

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Interessant. Nach 5 Antworten hat noch keiner die naheliegenste Lösung gepostet, die da lautet: MsgWaitForMultipleObjects. Einen Thread halte ich an dieser Stelle für Ressourcenverschwendung.

peep 2. Nov 2008 11:53

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Zitat:

Zitat von Apollonius
Interessant. Nach 5 Antworten hat noch keiner die naheliegenste Lösung gepostet, die da lautet: MsgWaitForMultipleObjects. Einen Thread halte ich an dieser Stelle für Ressourcenverschwendung.

Naja, nicht jeder kennt eben alles :wink: .

Wenn Application.ProcessMessages nicht kompiliert, nehme ich halt MultiTasken :mrgreen: .

alzaimar 2. Nov 2008 12:35

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Zitat:

Zitat von Apollonius
Interessant. Nach 5 Antworten hat noch keiner die naheliegenste Lösung gepostet, die da lautet: MsgWaitForMultipleObjects.

Auf was für andere Objekte würdest du hier warten? Wie sähe dann der Code aus? Und wie lange hast Du dafür gebraucht? oder kennst Du die Einstellungen der Maskierungsbit auswendig...

Zitat:

Zitat von peep
Wenn Application.ProcessMessages nicht kompiliert, nehme ich halt MultiTasken :mrgreen: .

Delphi-Quellcode:
Uses Forms;
Ich würde die Routine mal umbenennen, denn nachher bekommt du noch aus Versehen einen Nobelpreis, weil Du Multitasking hast, wo gar keins ist. :zwinker:
Zitat:

Zitat von jfheins
Da finde ich den Thread eleganter :mrgreen:

Nun ja, aber auch komplizierter. (Kompliziert = Elegant :gruebel: )
Wenn ich da eine Schleife habe, die auf irgendwas wartet, und ich hab keinen Bock, das die Anwendung einfriert, ruf ich eben kurz mal 'Application.ProcessMessages' auf. Wozu einen einzigen(!) Task im Hintergrund ablaufen lassen, während der Anwender eh nichts machen kann, außer sich zu freuen, das die GUI nicht eingefroren ist...?

Apollonius 2. Nov 2008 12:39

Re: WaitForSingleObject - GUI nicht ansprechbar
 
Delphi-Quellcode:
while MsgWaitForMultipleObjects(1, @Handle, False, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1 do
  Application.ProcessMessages;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 Uhr.
Seite 1 von 2  1 2      

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