Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Sleep im Thread?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 14.10.2009, 16:09    Titel: Sleep im Thread? Antworten mit Zitat

Code:
Sleep 1
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
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 14.10.2009, 17:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 14.10.2009, 18:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 15.10.2009, 07:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 15.10.2009, 08:12    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 15.10.2009, 13:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 19.10.2009, 22:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 20.10.2009, 07:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz