Thread rechenzeit zuweisen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Thread rechenzeit zuweisen

Beitrag von haderlump »

Problemhintergrund:
Ich schreib ja ein Programm zur Steuerung einerModelleisenbahn.
Dabei wird das Gleisbild natürlich auf dem Bildschirm dargestellt. Das läuft im Prinzip so ab. Es gibt eine Symboldatei, wo die einzelnen Gleiselemente abgelegt sind
Und zwar in Abhängigkeit von verschiedenene Betriebszuständen.
Auf dem Bildschirmgibt es ein Paintobjekt. Die Symboldatei ist unsichtbar im Hintergrund. Nun werden die Symbole per CopyRecht Funktion in das Paintobjekt copiert.
Da ich für die Moba natürlich einen älteren Rechner verwende dauert das etwas, so ca. 1 Sekunde. Das ist ausreichend schnell.
Jedes Symbolhat 9 x 13 Pixel. Das ist nicht sehr groß. Ich kann dadurch aber viel Information auf die Zeichenfläche bringen.
Nun habe ich noch einen Lupenfunktion programmiert. Diese funktioniert genau so,nur ist das Zielobjekt ein Bild im Hintergrund.
Alles ist nun 3 x so groß. hat also die 9 fache Fläche. Und die aktion dauert nun ca. 9 Sekunden.
Alles das was ich beshrieben habe läuft einwandfrei.
Meine Idee wäre nun, den Aufbau des Lupenhintergrundes (der nicht so eilig ist) in einen eigenen Thread zu verschieben.
Das würde aber nur die Langsamkeit ins System verlagern.
So und nun zur eigentlichen Frage: Kann man dem Thread einen Rechenzeitanteil zuweisen z.B 10%. und wie würde das gehen.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Thread rechenzeit zuweisen

Beitrag von mse »

haderlump hat geschrieben:Da ich für die Moba natürlich einen älteren Rechner verwende dauert das etwas, so ca. 1 Sekunde. Das ist ausreichend schnell.
Jedes Symbolhat 9 x 13 Pixel. Das ist nicht sehr groß. Ich kann dadurch aber viel Information auf die Zeichenfläche bringen.
Nun habe ich noch einen Lupenfunktion programmiert. Diese funktioniert genau so,nur ist das Zielobjekt ein Bild im Hintergrund.
Alles ist nun 3 x so groß. hat also die 9 fache Fläche. Und die aktion dauert nun ca. 9 Sekunden.

Das ist auch für einen älteren Rechner sehr viel. Seltsam auch, dass die Zeit sich linear zur Fläche verhält. Das deutet darauf hin, dass die copyrect() Funktion dominiert und eine schlechte Performance hat. Ich würde die Symbole in einer Imagelist vorhalten und dafür sorgen, dass die BitBlockTransfer (BIT BLIT)-Funktionen in der Graphikkarte ablaufen. Wichtig ist auch, nur die tatsächlich sichtbaren und veränderten Elemente zu zeichnen.
Alles das was ich beshrieben habe läuft einwandfrei.
Meine Idee wäre nun, den Aufbau des Lupenhintergrundes (der nicht so eilig ist) in einen eigenen Thread zu verschieben.
Das würde aber nur die Langsamkeit ins System verlagern.
So und nun zur eigentlichen Frage: Kann man dem Thread einen Rechenzeitanteil zuweisen z.B 10%. und wie würde das gehen.

Was ist das Ziel? Dass der Rechner während des Renderns bedienbar bleibt? Dafür sorgt das Betriebssystem mit einer geeigneten Rechenzeitverteilung auf die aktiven threads.
Zuletzt geändert von mse am So 19. Nov 2017, 09:05, insgesamt 1-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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: Thread rechenzeit zuweisen

Beitrag von m.fuchs »

Wie wäre es denn alternativ mit einem DrawGrid? Da stellst du die Zellengröße einfach auf 9x13 Pixel und speicherst die Daten über den Betriebszustand in einem gleich großen Array. Im OnDrawCell schaust du dann nur nach welcher Betriebszustand im korrespondierenden Array-Element eingetragen ist und zeichnest das entsprechende Symbol.
Vorteil: Es werden nur die Bereich gezeichnet, die gerade sichtbar sind. Wenn ich dich recht verstanden habe, dann zeichnest du alles. Sowas dauert natürlich länger.
Zoomen ist auch recht einfach: Die Zellengröße wird auf 27x39 Pixel gestellt und größere Symbole gezeichnet.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Thread rechenzeit zuweisen

Beitrag von haderlump »

Danke für die Antworten
da waren eine Menge guter Vorschläge dabei, die werde ich umsetzen.
Auf das erste Zeichnen werde ich komplett verzichten, stattdessen werde ich beim ausschalten die letzte Grafik mit saveToFile sichern.
Beim Start hole ich das Bild dann einfach rein.
Es gibt viele leere Felder, die brauch ich dann auch nicht mehr behandeln.
Bei den anderen Feldern werde ich nur die Elemente behandeln, die sich verändert haben.
Ich denke dann werde ich hin kommen.
Ich melde mich wieder,wenn ich das umgesetzt habe,(oder wenn dann ein neues Problem Auftrit :x

Gruß Fritz

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Thread rechenzeit zuweisen

Beitrag von kupferstecher »

Zeig mal ein Screenshot.
"Das tät mich ziemlich intressieren."

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Thread rechenzeit zuweisen

Beitrag von haderlump »

Hallo Kupferstecher. hier der Screenshot Bild
Die Maus steht links oben bei den beiden Sperrsignalen. Die rot gefärbten Gleisabschnitte sind durch Fahrzeuge belegt.
links über dem Meldungsfeld ist die Lupenanzeige.
Rechts ist das Bedienfeld für die Fahrsteuerung. Auf dem Bild ist leider alles etwas unscharf

Gruß Fritz

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Thread rechenzeit zuweisen

Beitrag von mschnell »

Ich habe vor vielen Jahren mal mit stretchblt (oder so ähnlich) "Zoom und Pan" für riesige Pixel-Bilder realisiert. Das war damals schon "in Realtime" bedienbar.

Die Ankopplung an das Grafik-Subsystem habe ich mit SDL gemacht.

-Michael

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Thread rechenzeit zuweisen

Beitrag von Warf »

Rechenzeit direkt zuweisen geht nicht. Aber es gibt ein paar tricks die man anwenden kann. Zum einen haben Threads prioritäten. Siehe TThread.Priority. Das dürfte genau das sein was du suchst. Es gibt auch noch eine andere Möglichkeit, mit der du die Rechenzeit deines Threads besser kontrollieren kanst. Du kannst Sleep verwenden. Sleep pausiert deine Thread für mindestens die angegebene Zeit. Viel wichtiger in deinem Kontext ist aber das Sleep die rechenzeit deines Threads Freigibt. Das heist bei dem Aufruf von Sleep wird der Scheduler deines Betriebsystems angeschmissen und schaut ob ein anderer Thread (oder ein anderer Prozess) in der Queue ist, und falls dem so ist (wäre verwunderlich wenn nicht) bekommt dieser als nächstes Rechenzeit zugewiesen.

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Thread rechenzeit zuweisen

Beitrag von kupferstecher »

haderlump hat geschrieben:Problemhintergrund:
Diese funktioniert genau so,nur ist das Zielobjekt ein Bild im Hintergrund.
Alles ist nun 3 x so groß. hat also die 9 fache Fläche. Und die aktion dauert nun ca. 9 Sekunden.

Verstehe ich das richtig, dass du für die Lupe eine Bitmap mit Fläche 3x des Bildschirms (in jede Richtung) vorhältst und daraus dann das aktuelle Lupenbild rauskopierst? Die Pixel scheinen ja mitvergrößert zu werden. Dann kannst du doch die aktuelle Lupenansicht aus der tatsächlichen Anzeige kopieren und in Echtzeit vergrößern.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Thread rechenzeit zuweisen

Beitrag von haderlump »

Kuperstecher
Ja ich halte eine eigene Bitmap vor.
Das mit dem Vergrößern gefällt mir nicht Da alles im Prinzip recht klein ist werden die Symbole arg zackig. Ich hab mir deshalb die Mühe gemacht die Symbole 2 mal zu zeichnen. Groß und klein, das sieht einfach schöner aus. (nicht auf dem Screenshot, das sind die noch nicht verfeinerten Symbole.)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Thread rechenzeit zuweisen

Beitrag von mschnell »

Warf hat geschrieben: Sleep pausiert deine Thread für mindestens die angegebene Zeit.

Ist aber nur eine Not-Lösung. Besser ist es, Warteschleifen völlig zu vermeiden und Timer oder Hardware-Events zur Verwaltung der Rechenzeit--Zuweisung an Threads zu verwenden.

-Michael

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Thread rechenzeit zuweisen

Beitrag von haderlump »

Danke für eure Hilfen und Anregungen.
Das Problem ist für mich gelöst.
Ich zeichne nur noch Rechtecke, die verändert wurden, Dauer nun 1-2 Sekunden, das ist ok.

Gruß Fritz

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Thread rechenzeit zuweisen

Beitrag von Warf »

mschnell hat geschrieben:
Warf hat geschrieben: Sleep pausiert deine Thread für mindestens die angegebene Zeit.

Ist aber nur eine Not-Lösung. Besser ist es, Warteschleifen völlig zu vermeiden und Timer oder Hardware-Events zur Verwaltung der Rechenzeit--Zuweisung an Threads zu verwenden.

-Michael


Es geht ja nicht darum sleep zum warten zu verwenden, sondern sleep(1) zu verwenden um den Prozess scheduler anzuwerfendem

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Thread rechenzeit zuweisen

Beitrag von mschnell »

Warf hat geschrieben:Es geht ja nicht darum sleep zum warten zu verwenden, sondern sleep(1) zu verwenden um den Prozess scheduler anzuwerfendem

Soweit ich weiß hängt es vom OS ab, ob das tatsächlich so funktioniert.
Außerdem: wann genau meinst Du ist das sinnvoll ? Hört sich auch nach "closed loop" an, was man wenn irgend möglich vermeiden sollte.

-Michael

Antworten