TMemo blockiert Fenste, wird langsamer und kein Multitasking

Für Fragen von Einsteigern und Programmieranfängern...
Marc
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

Beitrag von Marc »

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.
Dateianhänge
tmemo.zip
(126.96 KiB) 62-mal heruntergeladen
Good code comes from experience, experience comes from bad code.

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: TMemo blockiert Fenste, wird langsamer und kein Multitas

Beitrag von KenntKeinSchwein AG »

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.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
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

Beitrag von m.fuchs »

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

Marc
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

Beitrag von Marc »

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?
Good code comes from experience, experience comes from bad code.

shokwave
Beiträge: 470
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

Beitrag von shokwave »

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

Marc
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

Beitrag von Marc »

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.
Good code comes from experience, experience comes from bad code.

shokwave
Beiträge: 470
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

Beitrag von shokwave »

Marc hat geschrieben:Der Befehl wird akzeptiert, es gibt aber keine sichtbare Veränderung.

Ist er auch innerhalb der for-Schleife (begin - end), wie in meinem Beispiel?
mfg Ingo

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: TMemo blockiert Fenste, wird langsamer und kein Multitas

Beitrag von itjump »

Ein Thread halte ich für die sinnvollste Lösung, da du das auch in späteren Projekten wiederverwenden kannst. http://wiki.freepascal.org/Multithreaded_Application_Tutorial/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).

Mathias
Beiträge: 6194
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

Beitrag von Mathias »

Mein PC braucht dafür auch nicht mal 50ms, ich habe einen I7.

Unter Win XP ist während einer Ausgabe das Fenster tform nicht verschiebbar.

Das ist eine typische Windows-Krankheit.

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

Marc
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

Beitrag von Marc »

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.
Dateianhänge
tmemo2.zip
(127.27 KiB) 66-mal heruntergeladen
Good code comes from experience, experience comes from bad code.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
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

Beitrag von m.fuchs »

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?

Irgendein drei oder vier Jahre altes Dual-Core-System. Genaue Daten habe ich grad nicht hier.

Marc hat geschrieben:Bleibt es denn bei dieser Geschwindigkeit wenn man den Button mehmals drückt?

Wechsel zwischen 34ms und 36ms hin und her. Vermutlich je nachdem wieviel sonst so auf dem PC passiert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6194
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

Beitrag von Mathias »

Nur etwas unschön unter Linux scrollt der Text nicht nach oben. Es zeigt also nicht die letzte geschriebene Linie.

Probiere mal dies:

Code: Alles auswählen

Memo1.SelStart := -2; 


Ein Problem was bleibt ist das tmemo immer langsamer wird. Da muss ich noch etwas forschen.

Ich denke, dies wird ab einer bestimmten Grösse normal sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marc
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

Beitrag von Marc »

Ja. Memo1.SelStart := -2; hat geholfen.

Vielen Dank.
Good code comes from experience, experience comes from bad code.

TerribleCode
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

Beitrag von TerribleCode »

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?

Füge deiner Anwendung einfach eine OnCloseQuery-Prozedur hinzu, in der du ein boolschen Wert setzt, der in der Schleife geprüft wird.
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;

Mathias
Beiträge: 6194
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

Beitrag von Mathias »

Code: Alles auswählen

if CloseRequested then halt;

Muss das unbedingt so brutal sein ?
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

Antworten