Autor |
Beitrag |
Sascha999999999
      
Beiträge: 17
|
Verfasst: So 28.10.07 01:31
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
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 28.10.07 10: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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 28.10.07 11: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; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 28.10.07 12: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 ...
Zuletzt bearbeitet von hathor am So 28.10.07 12:37, insgesamt 1-mal bearbeitet
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 28.10.07 12:16
Bevor du auf die Idee kommst, den Assemblercode in dein Delphi-Programm einzubauen.
Zwischen
Delphi-Quelltext
und
Delphi-Quelltext 1: 2: 3: 4:
| asm PUSH 1024 CALL Sleep end; |
besteht kein Unterschied.
|
|
Sascha999999999 
      
Beiträge: 17
|
Verfasst: So 28.10.07 14: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?
Zuletzt bearbeitet von Sascha999999999 am So 28.10.07 15:01, insgesamt 1-mal bearbeitet
|
|
Sascha999999999 
      
Beiträge: 17
|
Verfasst: So 28.10.07 15: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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 28.10.07 15:16
Ist wohl etwas Energieverschwendung (volle Prozessauslastung durch Polling), aber das geht natürlich auch.
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: So 28.10.07 18: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 
      
Beiträge: 17
|
Verfasst: So 28.10.07 20:26
naja, es geht ja auchnicht um ring3, ich blocke erst alle Interrupts.
|
|