Thread rechenzeit zuweisen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Thread rechenzeit zuweisen

Beitragvon haderlump » 19. Nov 2017, 04:34 Thread rechenzeit zuweisen

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.
haderlump
 
Beiträge: 101
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon mse » 19. Nov 2017, 08:41 Re: Thread rechenzeit zuweisen

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 19. Nov 2017, 09:05, insgesamt 1-mal geändert.
mse
 
Beiträge: 1986
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon m.fuchs » 19. Nov 2017, 08:57 Re: Thread rechenzeit zuweisen

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon haderlump » 19. Nov 2017, 10:08 Re: Thread rechenzeit zuweisen

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
haderlump
 
Beiträge: 101
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon kupferstecher » 19. Nov 2017, 10:28 Re: Thread rechenzeit zuweisen

Zeig mal ein Screenshot.
"Das tät mich ziemlich intressieren."
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon haderlump » 19. Nov 2017, 19:14 Re: Thread rechenzeit zuweisen

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
haderlump
 
Beiträge: 101
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon mschnell » 20. Nov 2017, 09:59 Re: Thread rechenzeit zuweisen

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
mschnell
 
Beiträge: 3226
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Warf » 20. Nov 2017, 19:24 Re: Thread rechenzeit zuweisen

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.
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon kupferstecher » 20. Nov 2017, 22:01 Re: Thread rechenzeit zuweisen

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.
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon haderlump » 21. Nov 2017, 06:00 Re: Thread rechenzeit zuweisen

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.)
haderlump
 
Beiträge: 101
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon mschnell » 21. Nov 2017, 09:49 Re: Thread rechenzeit zuweisen

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
mschnell
 
Beiträge: 3226
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon haderlump » 21. Nov 2017, 19:22 Re: Thread rechenzeit zuweisen

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
haderlump
 
Beiträge: 101
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon Warf » 21. Nov 2017, 21:57 Re: Thread rechenzeit zuweisen

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
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon mschnell » 22. Nov 2017, 09:33 Re: Thread rechenzeit zuweisen

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
mschnell
 
Beiträge: 3226
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried