Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Sleep per ASM?
Sascha999999999 - So 28.10.07 00:31
Titel: Sleep per ASM?
ist es igendwie möglich per Assembly die Sleep funktion aufzurufen?
also sowohl per API call also auch alles andere was genau und nicht zu lage dauert, also möglichst kein ist, fände ich toll.
Danke.
mfg
Sascha999999999
Delete - So 28.10.07 09:36
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Delay(seconds: Longint); var WaitSecs: DWORD; FirstTickCount: DWORD; begin WaitSecs := seconds * 1000; FirstTickCount := GetTickCount; repeat Application.ProcessMessages; until ((FirstTickCount > GetTickCount) or ((GetTickCount - FirstTickCount) >= WaitSecs)); end; |
BenBE - So 28.10.07 10:09
@hathor: Was soll das mit ASM zu tun haben? Bitte Frage lesen ...
Jep. Die Möglichkeit gibt es:
Delphi-Quelltext
1: 2: 3: 4:
| asm PUSH 1024 CALL Sleep end; |
Delete - So 28.10.07 11:10
BenBE hat folgendes geschrieben: |
@hathor: Was soll das mit ASM zu tun haben? Bitte Frage lesen ...
|
...also auch alles andere was genau und nicht zu lage dauert, also möglichst klein ist, fände ich toll.
Anderes Beispiel:
Delphi-Quelltext
1: 2: 3: 4:
| procedure delay(dwMilliseconds: longint);external 'kernel32.dll' name 'Sleep';
Aufruf: delay(1); |
@BenBE:
Bitte Frage lesen ...Bitte Frage lesen ...Bitte Frage lesen ...Bitte Frage lesen ...Bitte Frage lesen ...
delfiphan - So 28.10.07 11:16
Bevor du auf die Idee kommst, den Assemblercode in dein Delphi-Programm einzubauen.
Zwischen
und
Delphi-Quelltext
1: 2: 3: 4:
| asm PUSH 1024 CALL Sleep end; |
besteht kein Unterschied.
Sascha999999999 - So 28.10.07 13:29
Delphi-Quelltext
1: 2: 3: 4:
| asm PUSH 1024 CALL Sleep end; |
ist gut, nur geht es um einen call außerhalb der anwendung, muss ich dann nicht erst Sleep definieren?
Sascha999999999 - So 28.10.07 14:00
BenBE, hatte die Lösung.
mit QueryPerformanceFrequency die fRDTSC auslesen und dann mit:
Quelltext
1:
| Millissekunden * fRDTSC / 1000 |
die wartetackte ausrechnen die man dann mit:
Delphi-Quelltext
1: 2: 3: 4:
| asm @@: loop @@ end; |
laufen lassen kann.
Gruß und dank an BenBE
Sascha
delfiphan - So 28.10.07 14:16
Ist wohl etwas Energieverschwendung (volle Prozessauslastung durch Polling), aber das geht natürlich auch.
dummzeuch - So 28.10.07 17:09
delfiphan hat folgendes geschrieben: |
| Ist wohl etwas Energieverschwendung (volle Prozessauslastung durch Polling), aber das geht natürlich auch. |
Nicht nur Energieverschwendung: Andere Programme bekommen voellig unnoetig Rechenzeit entzogen. Und spaeter wundern sich die User dann, weshalb ihr Videoschnitt Block-Artefakte liefert, weil der Decompressor nicht genuegend Prozessorzeit bekommt....
Sascha999999999 - So 28.10.07 19:26
naja, es geht ja auchnicht um ring3, ich blocke erst alle Interrupts.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!