Autor Beitrag
magnitudo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

WIN 8.1

BeitragVerfasst: Do 09.04.09 21:29 
Hallo zusammen,

weshalb wird der Programmfortschritt bei einer Formularanwendung durch anklicken auf den oberen Fensterbalken, angehalten ?
Klickt man währen der Laufzeit z.B. einer Repeat-Until-Schleife auf den oberen Fenster-Balken
(um das Fenster z.B. zu verschieben), wird die Schleife nicht weiter abgearbeitet.
Hier hilft dann auch kein Application.ProcessMessages innerhalb der Schleife.
Beim Anklicken des Fensterbalkens reicht ein kontinuierlicher linker Mausklick schon aus, ohne das Fenster zu verschieben.
Und der Programmfortschritt bleibt stehen.
Gibt es eine Möglichkeit dies zu umgehen ?


Vielen Dank schon mal im Voraus
MFG
Thomas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.04.09 21:44 
Du kannst einen weiteren Thread als den Hauptthread benutzen. Der läuft dann normal weiter, nur die Oberfläche wird derweil nicht aktualisiert.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 09.04.09 23:34 
user profile iconmagnitudo hat folgendes geschrieben Zum zitierten Posting springen:
Hier hilft dann auch kein Application.ProcessMessages innerhalb der Schleife.

Bist du sicher, dass du das richtig beobachtet hast? Wenn dein Programm in der Schleife ist, sollte es eigentlich keine Nachrichten aus der Nachrichtenschleife abarbeiten können. Es sollte also nicht mehr reagieren. Rufst du jetzt in der Schleife Application.ProcessMessages auf wird die Schleife solange unterbrochen bis alle Nachrichten aus der Nachrichtenschleife abgearbeitet sind. Verschiebst du jetzt das Fenster, bekommt es von Windows andauernd nachrichten, so dass Application.ProcessMessages erst wieder zurückkehr, wenn du das Fenster wieder los läst. In der Zeit, in der die Nachrichten abgearbeite werden, wird natürlich deine Schleife nicht weiter ausgeführt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.04.09 23:42 
Das ist schon richtig, nur löst das das Problem nicht, denn gewünscht ist ja vermutlich eine reagierende Oberfläche, die Verschiebbarkeit und das weitere Abarbeiten der Aufgabe.

Und das wird in der Kombination nur mit Threads gehen. Wenn das Application.ProcessMessages raus ist, dann sieht man zwar die Aktualisierungen und die Rechnung läuft weiter, aber die Oberfläche reagiert nicht mehr und lässt sich erst gar nicht verschieben.
magnitudo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

WIN 8.1

BeitragVerfasst: Fr 10.04.09 00:02 
Hallo zusammen,

schon mal vielen Dank für die Tipps!
Übrigens muss die Oberfläche nicht einmal reagieren können.
Das ist mir in diesem Fall nicht wichtig, sondern nur die unterbrechungsfreie Abarbeitung der Schleife
während einer Fensterverschiebung.

Wie muss ich mir dass mit dem zusätzlichen Thread vorstellen und wie sieht das programmtechnisch aus ?
Kannst Du mir dazu vielleicht ein Beispiel geben?

Vielen Dank
Gruß
Thomas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 10.04.09 00:08 
user profile iconmagnitudo hat folgendes geschrieben Zum zitierten Posting springen:
Übrigens muss die Oberfläche nicht einmal reagieren können.
Das ist mir in diesem Fall nicht wichtig, sondern nur die unterbrechungsfreie Abarbeitung der Schleife
während einer Fensterverschiebung.
Äh, was denn jetzt? Eine Fensterverschiebung ist ja nur möglich, wenn die Oberfläche reagiert. :?!?:

Wenn die Oberfläche nicht reagieren muss, dann nimm zur Aktualisierung des Fortschritts nur Repaint z.B. der ProgressBar statt gleich alle Botschaften abzuarbeiten mit Application.ProcessMesages.
magnitudo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

WIN 8.1

BeitragVerfasst: Fr 10.04.09 00:46 
Hallo Jaenicke,

vielleicht hab ich mich falsch ausgedrückt. Unter einer reagierenden Oberfläche
verstehe ich das reagieren von VCL Componenten, Buttons usw.
Aber dies ist in meiner speziellen Anwendung egal.
Ich hätte es eben gerne daß die Schleife weiter läuft, auch wenn das Fenster verschoben wird.

Gruß
Thomas
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 10.04.09 00:53 
Dann wirst du den Code in der Schleife in einen Thread auslagern müssen.
magnitudo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

WIN 8.1

BeitragVerfasst: Fr 10.04.09 13:19 
Hallo Luckie,

bzg. auslagern in einen Thread:
Gibt es dafür ein einfaches Beispiel, was ich Programmtechnisch leicht umsetzen kann ?

Vielen Dank und Gruß
Thomas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 10.04.09 17:56 
Du kannst dich ja mal im Internet umschauen, es gibt einige Tutorials dazu:
www.michael-puff.de/...er/Delphi/Tutorials/
www.delphi-treff.de/...bjectpascal/threads/
Das erste ist sehr sehr ausführlich (von Luckie ;-)), das zweite ein Überblick.