TMemo blockiert Fenste, wird langsamer und kein Multitasking
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
TMemo blockiert Fenste, wird langsamer und kein Multitasking
Hallo
Ich ein paar Fragen zu zu dem Programm das ich angehängt habe.
Es sind zwei Tmemo Felder in die hineingeschrieben wird, wenn jeweils der dazugehörige Button gedrückt wird
Erstens : Unter Win XP ist während einer Ausgabe das Fenster tform nicht verschiebbar. Ist wie blockiert solange die Ausgabe beschäftigt ist. Ist das nur unter XP (Virtual Box) so?
Unter Linux geht das problemlos.
Zweitens : Da ich ja mehrere Prozessor Kerne habe, möchte ich während ein erstes Tmemo beschäftigt, ist eine weitere Funktion (in dem Fall testweise ein zweites Tmemo) beschäftigen.
Kann ich mit meinem Programm auf die schnelle immer nur einen Kern beschäftigen? Habe schon was gefunden mit Multithreading aber das scheint komplexer zu werden.
Gibt es das einfachere Lösungen? Gedacht wäre das ganze in erster Linie um längere Log files zu durchsuchen.
Drittens : Interessant ist auch das Tmemo immer langsamer wird je öfter ich das verwende (Button mehrmals hintereinander drücken). Im Schnitt ca 50% Geschwindigkeitsverlust.
Das passiert in Linux und WinXP genauso.
Ich ein paar Fragen zu zu dem Programm das ich angehängt habe.
Es sind zwei Tmemo Felder in die hineingeschrieben wird, wenn jeweils der dazugehörige Button gedrückt wird
Erstens : Unter Win XP ist während einer Ausgabe das Fenster tform nicht verschiebbar. Ist wie blockiert solange die Ausgabe beschäftigt ist. Ist das nur unter XP (Virtual Box) so?
Unter Linux geht das problemlos.
Zweitens : Da ich ja mehrere Prozessor Kerne habe, möchte ich während ein erstes Tmemo beschäftigt, ist eine weitere Funktion (in dem Fall testweise ein zweites Tmemo) beschäftigen.
Kann ich mit meinem Programm auf die schnelle immer nur einen Kern beschäftigen? Habe schon was gefunden mit Multithreading aber das scheint komplexer zu werden.
Gibt es das einfachere Lösungen? Gedacht wäre das ganze in erster Linie um längere Log files zu durchsuchen.
Drittens : Interessant ist auch das Tmemo immer langsamer wird je öfter ich das verwende (Button mehrmals hintereinander drücken). Im Schnitt ca 50% Geschwindigkeitsverlust.
Das passiert in Linux und WinXP genauso.
- Dateianhänge
-
tmemo.zip
- (126.96 KiB) 80-mal heruntergeladen
Good code comes from experience, experience comes from bad code.
-
- Beiträge: 26
- Registriert: So 4. Dez 2016, 13:35
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Unter Windows läuft das synchron zum Hauptthread. D.h., du musst entweder einen eigenen Thread erstellen oder das Programm anweisen bestimmte Dinge Asynchron zu tun.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2811
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Solange deine Methode läuft, kann das Fenster nicht auf Nachrichten vom OS/Fenstermanager reagieren. Das Verschieben klappt also nicht. Wobei mir das hier nicht aufgefallen wäre, die Abarbeitung liegt bei unter 50 ms.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Danke für die Antworten.
Komisch ist das das Verschieben des Fensters unter Linux funktioniert.
Solange dieses tmemo läuft kann ich auch keine Ausgaben machen zB. Zählerstand nach Button1.caption
Gibt es denn etwas besseres (Textausgabefenster) das nichts blockiert, das ich scrollen kann und eventuell etwas editieren wie ein Schreibprogramm ?
Oder mach ich das am besten selbst?
Das windows XP braucht bei mir 4000 ms, Linux schafft es mit ca. 300mS.
Jetzt frage ich mich was das für ein Supercomputer ist der das in 50mS macht?
Bleibt es denn bei dieser Geschwindigkeit wenn man den Button mehmals drückt?
Komisch ist das das Verschieben des Fensters unter Linux funktioniert.
Solange dieses tmemo läuft kann ich auch keine Ausgaben machen zB. Zählerstand nach Button1.caption
Gibt es denn etwas besseres (Textausgabefenster) das nichts blockiert, das ich scrollen kann und eventuell etwas editieren wie ein Schreibprogramm ?
Oder mach ich das am besten selbst?
Das windows XP braucht bei mir 4000 ms, Linux schafft es mit ca. 300mS.
Jetzt frage ich mich was das für ein Supercomputer ist der das in 50mS macht?
Bleibt es denn bei dieser Geschwindigkeit wenn man den Button mehmals drückt?
Good code comes from experience, experience comes from bad code.
-
- Beiträge: 475
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Wenn du "Application.Processmessages" in die Schleife einbaust, bleibt dein Programm ansprechbar, wird allerdings auch etwas langsamer.
Code: Alles auswählen
For I := 0 to 2500 do
begin
Form1.Memo1.Lines.Add(IntToStr(i)+' Short Test Text');
Button1.Caption:=IntToStr(i);
Application.ProcessMessages;
end;
mfg Ingo
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Das ist ein guter Tip. Sowas wäre nicht schlecht.
Aber es funktioniert nicht bei mir.
Der Befehl wird akzeptiert, es gibt aber keine sichtbare Veränderung.
Aber es funktioniert nicht bei mir.
Der Befehl wird akzeptiert, es gibt aber keine sichtbare Veränderung.
Good code comes from experience, experience comes from bad code.
-
- Beiträge: 475
- Registriert: Do 15. Nov 2007, 16:58
- OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
- CPU-Target: i386, x64
- Wohnort: Gera
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Ist er auch innerhalb der for-Schleife (begin - end), wie in meinem Beispiel?Marc hat geschrieben:Der Befehl wird akzeptiert, es gibt aber keine sichtbare Veränderung.
mfg Ingo
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Ein Thread halte ich für die sinnvollste Lösung, da du das auch in späteren Projekten wiederverwenden kannst. http://wiki.freepascal.org/Multithreade ... utorial/de Damit habe ich es hinbekommen und ich nutze noch heute in all meinen GUI Apps Multithreading, weil dadurch meine Programme nicht einfrieren. Allerdings mache ich das mittlerweile Ausschließlich in C#, weil ich es da nur einmal Kompelieren muss und dann läuft es überall, also auch Linux und Mac (Microsoft sei dank, haben die jetzt das Mono Projekt übernommen).
-
- Beiträge: 6917
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Mein PC braucht dafür auch nicht mal 50ms, ich habe einen I7.
Früher bei einem Singel-Core Prozessor, musste man Reset drücken. In diesem Beispiel jetzt nicht, aber wen man versehentlich eine Endlosschleife hatte.
Das ist eine typische Windows-Krankheit.Unter Win XP ist während einer Ausgabe das Fenster tform nicht verschiebbar.
Früher bei einem Singel-Core Prozessor, musste man Reset drücken. In diesem Beispiel jetzt nicht, aber wen man versehentlich eine Endlosschleife hatte.
Code: Alles auswählen
repeat
Form1.Memo1.Lines.Add(IntToStr(i)+' Short Test Text');
until false;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Ich Wurm.
Natürlich war das nicht in der Schleife drin.
Jetzt läuft das ganz passabel. Schon fast ein Multitasking Gefühl.
Es wird einfach der zuletzt gestartete Befehl ausgeführt. Das reicht mir schon.
Das mit richtigem Multithread zu machen ist noch zu schwer für mich.
Nur etwas unschön unter Linux scrollt der Text nicht nach oben. Es zeigt also nicht die letzte geschriebene Linie.
Das Programm abbrechen indem ich open rechts im Fenster schliessen drücke geht auch noch nicht.
Das wäre vieleicht noch gut zu wissen wie das geht?
Ein Problem was bleibt ist das tmemo immer langsamer wird. Da muss ich noch etwas forschen.
Vielen Dank Euch allen.

Jetzt läuft das ganz passabel. Schon fast ein Multitasking Gefühl.
Es wird einfach der zuletzt gestartete Befehl ausgeführt. Das reicht mir schon.
Das mit richtigem Multithread zu machen ist noch zu schwer für mich.
Nur etwas unschön unter Linux scrollt der Text nicht nach oben. Es zeigt also nicht die letzte geschriebene Linie.
Das Programm abbrechen indem ich open rechts im Fenster schliessen drücke geht auch noch nicht.
Das wäre vieleicht noch gut zu wissen wie das geht?
Ein Problem was bleibt ist das tmemo immer langsamer wird. Da muss ich noch etwas forschen.

Vielen Dank Euch allen.
- Dateianhänge
-
tmemo2.zip
- (127.27 KiB) 82-mal heruntergeladen
Good code comes from experience, experience comes from bad code.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2811
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Irgendein drei oder vier Jahre altes Dual-Core-System. Genaue Daten habe ich grad nicht hier.Marc hat geschrieben:Das windows XP braucht bei mir 4000 ms, Linux schafft es mit ca. 300mS.
Jetzt frage ich mich was das für ein Supercomputer ist der das in 50mS macht?
Wechsel zwischen 34ms und 36ms hin und her. Vermutlich je nachdem wieviel sonst so auf dem PC passiert.Marc hat geschrieben:Bleibt es denn bei dieser Geschwindigkeit wenn man den Button mehmals drückt?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 6917
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Probiere mal dies:Nur etwas unschön unter Linux scrollt der Text nicht nach oben. Es zeigt also nicht die letzte geschriebene Linie.
Code: Alles auswählen
Memo1.SelStart := -2;
Ich denke, dies wird ab einer bestimmten Grösse normal sein.Ein Problem was bleibt ist das tmemo immer langsamer wird. Da muss ich noch etwas forschen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 208
- Registriert: Fr 11. Nov 2016, 14:09
- OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Ja. Memo1.SelStart := -2; hat geholfen.
Vielen Dank.
Vielen Dank.
Good code comes from experience, experience comes from bad code.
-
- Beiträge: 38
- Registriert: Di 18. Nov 2014, 22:50
- OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
- CPU-Target: 64Bit
Schleife unterbrechen und dann Anwendung beenden
Füge deiner Anwendung einfach eine OnCloseQuery-Prozedur hinzu, in der du ein boolschen Wert setzt, der in der Schleife geprüft wird.Marc hat geschrieben:Das Programm abbrechen indem ich open rechts im Fenster schliessen drücke geht auch noch nicht.
Das wäre vieleicht noch gut zu wissen wie das geht?
Zum Beispiel so:
Code: Alles auswählen
var
CloseRequested: Boolean=False;
procedure TForm1.Button1Click(Sender:TObject);
var
i: Integer;
begin
for i:=0 to 9999999 do
begin
Label1.Caption:=IntToStr(i);
Application.ProcessMessages;
if CloseRequested then halt;
end;
end;
procedure TForm1.FormCloseQuery(Sender:TObject;var CanClose:boolean);
begin
CloseRequested:=True;
end;
-
- Beiträge: 6917
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TMemo blockiert Fenste, wird langsamer und kein Multitas
Code: Alles auswählen
if CloseRequested then halt;
Meisten reicht für sowas auch ein "Break";
http://wiki.freepascal.org/Break/de
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot