 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 14.10.2009, 16:09 Titel: Sleep im Thread? |
|
|
sollte in Schleifen regelmäßig [...] warten [...], um anderen Prozessen die Gelegenheit zu geben, Berechnungen durchzuführen. Dies wirkt sich positiv auf die Rechnerperformance und auch auf die Performance des eigenen Programms aus.
Hat jemand erfahrungen wie man die leistung eines Threads mit sleep herabsetzt?
Insbesondere, wenn Sleep 1 im thread und inkey im haupt-thread abgefragt werden, ist alles nicht so wie es sein sollte.. es hakelt unregelmäßig...
Im prinzip soll der Thread parallel zum hauptprogramm laufen und "warten" bis was passiert. Während des wartens soll der thread natürlich einige dinge erledigen, die aber keine hohe priorität haben. Solange der Thread "wartet" soll das system aber nicht voll ausgelastet sein. Und im hauptprogramm wird per inkey die tastatur abgefragt. Und genau dort hakelt es immer wieder..
Kann euch grade leider keinen quellcode zur verfügung stellen, es ist teil eines größeren projektes... könnte aber evtl. ein kleines beispiel-programm schreiben, wenns unbedingt erforderlich ist. Aber vielleicht weiss ja einer schon ohne quellcode wie sich Sleep in einem thread verhält... insbesondere wenn inkey im hauptprogramm abgefragt wird... |
|
Nach oben |
|
 |
The_Muh aka Mark Aroni

Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 14.10.2009, 17:51 Titel: |
|
|
was du machen könntest wäre COND's zu nutzen. Allerdings wartet ein Cond absolut, das heißt du kannst keine anderen dinge im thread erledigen, wärend der thread auf das signal aus dem hauptthread wartet. Ich kenn leider dein programm nicht, sonst würd ich eventuell noch andere lösungen finden... mit threads arbeite ich in letzter zeit öfter mal...
ansonsten: probier mal sleep 1,1 ... dann reagiert das sleep nicht auf tastendrücke. vielleicht löst das ja dein problem _________________ // nicht mehr aktiv // |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.10.2009, 18:29 Titel: |
|
|
Zitat: | probier mal sleep 1,1 ... dann reagiert das sleep nicht auf tastendrücke. vielleicht löst das ja dein problem |
Bringt nix, weil das flag bei verzögerungen unter 100ms automatisch gesetzt wird. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.10.2009, 07:26 Titel: |
|
|
Wenn dir 1000 Durchlaufe pro sek. (was bei sleep 1, 1 ca. gegeben is) zu wenig sind, kannst du mithilfe von Timer() das ganze etwas erhöhen.
Code: |
Dim XTot as Double
Do
If XTot < Timer() Then
Sleep 1, 1 'Zum CPU entlasten
XTot = Timer() + 0.001 'ca. 1000 Durchlaufe pro sek.
' XTot = Timer() + 0.01 'ca. 10000 Durchlaufe pro sek.
' XTot = Timer() + 0.1 'ca. 100000 Durchlaufe pro sek.
End If
Loop
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 15.10.2009, 08:12 Titel: |
|
|
@TPM: Hier gehts ja nicht um die performance von sleep sondern um konflikte zwischen sleep in einem thread und inkey innem anderen thread (wie z.B. in dem hauptthread) .. wenn ich per timer() in einer schleife warte, erkennt das betriebssystem das programm als 100% ausgelastet.. bzw bei multi-kern/threadding-systemen dann zu 50% ... und genau das möcht ich vermeiden.
sleep 1,1 scheint einen unterschied zu machen!! hm.. klappt doch wesentlich besser! |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.10.2009, 13:31 Titel: |
|
|
Das wäre aber ziemlich seltsam, das musst du dir entweder einbilden oder die englische und deutsche Referenz sind falsch - wobei ich eher bezweifle, dass sich da bezüglich Sleep in den letzten Jahren was geändert hat.
BTW: Sleep 1 wartet nicht eine Millisekunde, sondern ca. 15. Genauer geht der Windows-Timer standardmäßig nicht, dazu müsste man die Genauigkeit erst mit einem API-Call erhöhen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Luke

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 19.10.2009, 22:19 Titel: |
|
|
Nur mal so, dass ich da auch durchblicke:
Wenn man in einem Programm eine einfache Do_Loop Schleife hat, dann ist die CPU zu nahezu Hundert Prozent ausgelastet. Wenn man aber sleep 1, 1 mit in die Schleife packt, dann gibt man der CPU Zeit, sich um andere Berechnungen zu kümmern.
Nur hat das hat bei größeren Programmen zur Folge, dass sie lahmer laufen.
Wie kann man das jetzt verhindern, ohne dass die CPU völlig ausgelastet ist?
Hier mal ein Beispiel: Es wird eine Kugel gezeichnet, die sich durch einen Dreidimensionalen Raum bewegt, und sich an den Wänden abstößt.
Mit großer CPU Auslastung. Wie verhindert man das, ohne die Kugel erheblich langsamer zu bewegen?
Code: | screen 16, 32,2
dim as integer r, g, b, x, y, z, ra, rx, ry, rz, rs, gs, bs, ras, i, t
screenset 1, 0
r = 0
g = 0
b = 100
ra = 100
rs = r
gs = g
bs = b
ras = ra
x = 256
y = 192
z = 250
t= 100
rx = 1
ry = 1
rz = 1
do
line(0,0)-(t, t),rgb(0,0,100)
line(512,0)-(512-t, t),rgb(0,0,100)
line(0,384)-(t, 384-t),rgb(0,0,100)
line(512,384)-(512-t, 384-t),rgb(0,0,100)
line(t,t)-(512-t, t),rgb(0,0,100)
line(t,t)-(t, 384-t),rgb(0,0,100)
line(t,384-t)-(512-t, 384-t),rgb(0,0,100)
line(512-t,t)-(512-t, 384-t),rgb(0,0,100)
paint (256, 192),rgb(100,100,255),rgb(0,0,100)
paint (256, 0),rgb(80,80,255),rgb(0,0,100)
paint (256, 383),rgb(80,80,255),rgb(0,0,100)
paint (0, 192),rgb(60,60,255),rgb(0,0,100)
paint (511, 192),rgb(60,60,255),rgb(0,0,100)
r = rs
g = gs
b = bs
for i = ra to 0 step -1
circle(x, y), i,rgb(r, g, b),,,,F
if r < 255 then r = r+1
if g < 255 then g = g+1
if b < 255 then b = b+1
next
x = x+rx
y = y+ry
if z = 0 then z = 1
ra = ras/(500/z)
x = x+rx
y = y+ry
z = z+rz
if x > 512-t or x < ras then rx = rx*-1
if y > 384-t or y < ras then ry = ry*-1
if z > 500-t or z < ras then rz = rz*-1
pcopy 1, 0
cls
loop while inkey <> chr(27) |
Kann man hier mit dem Pageflipping noch was ändern? Pcopy bremst nämlich auch ganz schön _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 20.10.2009, 07:19 Titel: |
|
|
Indem man der berechnung noch einen zeitwert mitgibt.
Du brauchst ja nicht 1000 Frames pro sek. berechnen, sondern (theoretisch) nur ca. 50 um es dem auge flüssig erscheinen zu lassen.
Demzufolge reicht es aus, wenn du "gelegentlich" eine berechnung durchführst.
Alternativ ( bei deinem kleinen prog) reicht es auch aus, berechnung und zeichnung zu trennen.
Das zeichnen ist wesentlich rechenaufwendiger als die Matematische grundlage.
Daher kannst du einfach per timer() prüfung alle 1/50 einen neuzeichnung ausführen lassen.
ansonsten: siehe meinen letzten post, bzw. das
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|