Autor |
Beitrag |
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 06.10.05 10:56
In meinem Programm habe ich eine Prozedur, wo er ein bissl länger braucht um diese zu verarbeiten. Meine erste Idee waqr, damit er das Formular in der Zeit neu zeichnet Application.ProcessMessages oder HandleMessages zu verwenden. Allerdings verarbeitet er dann auch Messages, die er zu dem Zeitpunkt nicht verarbeiten soll, denn während die Prozedur arbeitet, soll nur die Messages für das Verändern der Formularposition, Größe, Minimieren, ... und das neu-zeichnen des Formulars verarbeitet werden. Wie kann man es mit einem geringsmöglichen Aufwand realisieren?
|
|
Alstar
      
Beiträge: 827
|
Verfasst: Do 06.10.05 11:15
Hi! Versuch es doch mal mit
Delphi-Quelltext
(Form1 durch Formularnamen ersetzen)
Alstar
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Do 06.10.05 11:17
Spricht was gegen ein modales Fortschrittsfenster?
Beschreib vielleicht etwas genauer was deine Anwendung macht.
|
|
MisterBum
      
Beiträge: 107
|
Verfasst: Do 06.10.05 11:33
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 06.10.05 13:31
Das ShowModal bring mich nicht weiter, denn es ist auf dem Hauptformular. Es geht um das Befüllen einer ListView mit Daten. Damit aber der Nutzer nicht nochmal draufklickt, also andere Daten reinfüllen lässt, soll erstmal die Befüllung fertig werden, da sonst ein Chaos entstehen könnte. Da es aber 1-2 Sekunden dauert, trotz BeginUpdate & Co, wird das Formular nicht neugezeichnet, was ich bissl lästig finde.
@Update: Ich glaube der reagiert dann aber nicht auf minimieren und verschieben des Fensters, oder?
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Do 06.10.05 14:27
Genau, es wird nur neu gezeichnet.
Hmm also ich bleibe bei einem neuen modalen Fenster, das scheint mir auch die standartkonformste Möglichkeit zu sein.
Kannst natürlich auch einfach die Komponente.Enabled:=false machen und den WarteCursor anzeigen.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 06.10.05 14:37
Nimm einen Thread. Vorm Starten deaktivierst du alles, was nicht geändert wrerden darf und wenn er fertig ist aktivierst du alles wieder. Das wäre die sauberste Lösung, denke ich.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 06.10.05 14:44
Mhm, Threads mag ich eigentlich nicht, vor allem da er hier eigentlich benötigt wird, denn mehrere Threads nimmt man ja eigentlich nur, wenn mehrere Dinge "gleichzeitig" gemacht werden soll, was ja eigentlich nicht bei diesem Fall der Fall ist.
Aber eigentlich dürfte es ja reichen, wenn ich für den Moment Form1.Enabled:=false mache.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 06.10.05 15:01
Es sollen doch Dinge gleichzeitig geschehen: Den Code in der Prozedur und das Fenster soll sich dabei noch neu zeichnen können. Wenn das nicht gleichzeitig ist, dann weiß ich es auch nicht. Und genau dazu sind Threads unteranderem gedacht, damit bei längeren Routinen das Fenster noch reagiert.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 06.10.05 15:14
Ja das schon, aber das erfordert doch eigentlich nicht gleich einen neuen Thread. Gibt es nicht die Möglichkeit zu überprüfen, welche Message anliegt und wenn bestimmte drin sind, diese durchführen zu lassen?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 06.10.05 15:23
Doch genau das erfordert einen weiteren Thread, da der Hauptthread des Fensters nicht die Nachrichten aus der Nachrichtenschlange von Windows abholen kann, da er gerade mit der Routine beschäftigt ist. Ergo brauchst du einen weiteren Thread für die Routine, damit der Hauptthread weiter die anstehenden Nachrichten verarbeiten kann.
|
|
Heiko 
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Do 06.10.05 15:33
Und woher weiß ich, welche Messages gekommen sind, und wie verarbeite ich die dann, wenn ich sie zulasse?
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Do 06.10.05 15:43
Brauchst du eigentlich nciht soweit ich mich entsinne.
Du kreirst ein Thread Objekt für deine langandauernde Methode und die läuft dann parallel.
Am Beginn und Anfang der Methode kannst du die Form Enablen und Disablen.
Aber eigentlich könntest du das doch auch gleich in der Funktion machen und in der Schleife ab und zu ProcessMessage senden oder
Naja Threads wären schon das sauberste aber ich meine trotzdem, dass ein Wartefenster das eleganteste ist, da der User ja während der Zeit nichts machen soll=> er muss darauf hingewiesen werden 
|
|