AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein WaitForSingleObject - GUI nicht ansprechbar
Thema durchsuchen
Ansicht
Themen-Optionen

WaitForSingleObject - GUI nicht ansprechbar

Ein Thema von Rer · begonnen am 2. Nov 2008 · letzter Beitrag vom 2. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Rer

Registriert seit: 7. Apr 2007
13 Beiträge
 
#1

WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 10:52
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 10:58
Du könntest dier Arbeit in einen Thread auslagern - dann bleibt deine Anwendung weiterhin problemlos bedienbar.

Delphi-Referenz durchsuchenTThread
  Mit Zitat antworten Zitat
peep
(Gast)

n/a Beiträge
 
#3

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 11:20
Oder setze in die Dateikonvertierungsschleife nach jeder Datei ein "MultiTasken"

Delphi-Quellcode:
procedure MultiTasken;
var
  M: TMsg;
begin
  if Peekmessage(M, 0, 0, 0, pm_Remove) then
  begin
    TranslateMessage(M);
    DispatchMessage(M);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 11:21
Diese "Multitasken"-Funktion gibt es in ähnlicher Form bereits als Application.ProcessMessages.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 12:25
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 12:32
Da finde ich den Thread eleganter

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;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 12:40
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
peep
(Gast)

n/a Beiträge
 
#8

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 12:53
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 .

Wenn Application.ProcessMessages nicht kompiliert, nehme ich halt MultiTasken .
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 13:35
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 von peep:
Wenn Application.ProcessMessages nicht kompiliert, nehme ich halt MultiTasken .
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.
Zitat von jfheins:
Da finde ich den Thread eleganter
Nun ja, aber auch komplizierter. (Kompliziert = Elegant )
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...?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: WaitForSingleObject - GUI nicht ansprechbar

  Alt 2. Nov 2008, 13:39
Delphi-Quellcode:
while MsgWaitForMultipleObjects(1, @Handle, False, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1 do
  Application.ProcessMessages;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:11 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