Thread rechenzeit zuweisen
-
- 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
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.
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.
-
- 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
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.
- 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: 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.
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
-
- 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
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
Gruß Fritz
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
Gruß Fritz
- kupferstecher
- Beiträge: 422
- Registriert: Do 17. Nov 2016, 11:52
Re: Thread rechenzeit zuweisen
Zeig mal ein Screenshot.
"Das tät mich ziemlich intressieren."
"Das tät mich ziemlich intressieren."
-
- 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
Hallo Kupferstecher. hier der Screenshot
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
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
-
- 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
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
Die Ankopplung an das Grafik-Subsystem habe ich mit SDL gemacht.
-Michael
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
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.
- kupferstecher
- Beiträge: 422
- Registriert: Do 17. Nov 2016, 11:52
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.
-
- 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
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.)
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.)
-
- 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
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
-
- 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
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
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
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
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
-
- 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
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