Autor Beitrag
Sascha999999999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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



BeitragVerfasst: So 28.10.07 10:36 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 28.10.07 11:09 
@hathor: Was soll das mit ASM zu tun haben? Bitte Frage lesen ...

Jep. Die Möglichkeit gibt es:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
asm
    PUSH 1024 //Anzahl Millisekunden
    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



BeitragVerfasst: So 28.10.07 12:10 
user profile iconBenBE 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 28.10.07 12:16 
Bevor du auf die Idee kommst, den Assemblercode in dein Delphi-Programm einzubauen.

Zwischen
ausblenden Delphi-Quelltext
1:
Sleep(1024);					

und
ausblenden Delphi-Quelltext
1:
2:
3:
4:
asm  
    PUSH 1024 //Anzahl Millisekunden  
    CALL Sleep  
end;


besteht kein Unterschied.
Sascha999999999 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 28.10.07 14:29 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
asm    
    PUSH 1024 //Anzahl Millisekunden    
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 28.10.07 15:00 
BenBE, hatte die Lösung.

mit QueryPerformanceFrequency die fRDTSC auslesen und dann mit:

ausblenden Quelltext
1:
Millissekunden * fRDTSC / 1000					


die wartetackte ausrechnen die man dann mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
asm
@@:
loop @@
end;

laufen lassen kann.

Gruß und dank an BenBE
Sascha
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 28.10.07 15:16 
Ist wohl etwas Energieverschwendung (volle Prozessauslastung durch Polling), aber das geht natürlich auch.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: So 28.10.07 18:09 
user profile icondelfiphan 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 28.10.07 20:26 
naja, es geht ja auchnicht um ring3, ich blocke erst alle Interrupts.