![]() |
beep oder windows.beep()
In Abhängigkeit vom Betriebsystem kann man mit beep und windows.beep über den Systemlautsprecher und/oder über die Soundkarte einen Ton erzeugen. Für mich bleibt die Frage was ist schneller.
Wird der Systemlautspecher vielleicht irgendwie direkt angesprochen und reagiert damit schneller??? Falls das keiner sagen kann: Hat jemand eine Idee wie man das Prüfen kann?? (Aber nicht nur mit hören) Danke Falk |
Re: beep oder windows.beep()
Meinst du du merkst einen Unterschied, den es da an Millisekunden geben könnte? :roll:
|
Re: beep oder windows.beep()
ja, weil ich den Ton nicht wirklich hören will, sondern zur Zeit einfach ein Kabel an der Soundkarte hängt, welches mit einer Messwerterfassungskarte zusammenhängt. Diese erfasst Daten mit 500 Hz. Dementsprechend kann mann auf 2 ms genau den unterschied rausbekommen.
Die Einfachste Lösung ist sicher ein zweites Kabel an den Systemlautsprecher zu löten und dann die beiden Kabel (Systemlautsprecher und Soundkarte) an zwei Kanäle der Messkarte zu hängen. Doch ich wollte erst mal vermeiden am Systemlautsprecher rumzubasteln. Falk |
Re: beep oder windows.beep()
Bei einem Intervall von 2ms wirst du mit Delphi aber Probleme bekommen. Das ist einfach zu schnell!
MfG Florian :hi: |
Re: beep oder windows.beep()
Der Systemlautsprecher könnte schon schneller sein, da dort "nur" der Wert für eine Frequenz (die man dann hört) hingeschickt wird. Hingegen wird der Beep bei der Soundkarte über eine Sound-Datei abgespielt. Und diese Datei muss ja auch erst mal zur Soundkarte. (ich habe da schon mal bei hoher Systemlast 2-3 Sekunden Verzögerung)
:gruebel: Wieso willst du den am Speaker rumlöten? Da gehen doch 2 nette Drähte vom Lautsprecher zum Mainboard und enden dort normalerweise auf einem Stiftleiste. Den brauchste doch nur abziehen und deine eigene Leitung anstecken. (eine entsprechende Buchse gibt es als Pfennigware in jedem Elektronikladen) |
Re: beep oder windows.beep()
Zitat:
Falk |
Re: beep oder windows.beep()
Zitat:
Delphi kompiliert auch 1ms. :D |
Re: beep oder windows.beep()
Hallo,
ich muß Daniel recht geben, 2 ms kannst Du vergessen. Unter WIN9x brauchst Du Dir keine Mühe zu geben, unter 10 ms zu kommen, Windows nimmt sich ab und zu Auszeiten von 100 ms und mehr. Mit Win2000/XP sind Zeiten um die 10 ms mit viel Aufwand zu schaffen. Die genannten Zeiten stammen aus eigenen leidvollen Erfahrungen. Viele Grüße |
Re: beep oder windows.beep()
Erfahrungstechnisch sollte man sich nicht unter 50ms begeben.
|
Re: beep oder windows.beep()
solange die Zeitdifferenz zwischen auslösen beep und dem wirklichen beep konstant ist soll mich das nicht stören. Ist sie das?? Ich vermute mal bei der Soundkarte hängt das sicher noch davon ab, was der Rechner gerade noch so macht. Bei systemlautsprecher doch nicht oder???
Falk |
Re: beep oder windows.beep()
Zitat:
|
Re: beep oder windows.beep()
@Falk,
nein, ist sie nicht. Da nützt auch der Interrupt nichts, der kommt erst zum Tragen, wenn der Beep gestartet wurde - und die Zeit bis zum Start ist nicht konstant. Viele Grüße |
Re: beep oder windows.beep()
Zitat:
Falk |
Re: beep oder windows.beep()
Jou!
Sobald sich Dein Programm in den Windows-Untiefen verkrümelt, und das macht es automatisch, wenn Du irgendeine Windows-Funktion aufrufst, hast Du keinen Einfluß mehr. Und das Schlimmste sind unter Win9x die nicht bestimmbaren Auszeiten. Du müßtest im Prinzip Dein Programm auf tpTimeCritical setzen und alle Funktionen in einer Schleife selbst schreiben, ohne Windows aufzurufen - hat allerdings den Effekt, daß nichts anderes mehr geht. Falls Du auf Win2k/Xp ausweichen kannst, kann ich Dir paar Tips geben, schaffe ich aber heute nicht mehr. Viele Grüße |
Re: beep oder windows.beep()
@Delphianer
ja läuft unter XP Falk |
Re: beep oder windows.beep()
Hallo, ist hier noch wer ?
Ich habe mal versucht und hoffentlich nichts vergessen, einige Punkte zu zeitkritischen Programmen unter 2000/XP aufzuschreiben: 1. PriorityClass von MainProcess hochsetzen - Vorsicht, kann ganzen Computer lahmlegen - dafür aber die ThreadPriority (vom MainProcess) so niedrig wie möglich
Delphi-Quellcode:
2.
if SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS) then
begin SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_IDLE); end; die originale Zeitauflösung von 2000/XP ist auf 10ms gesetzt, deshalb
Delphi-Quellcode:
und am Schluß wieder zurücksetzen
TimePeriod := 1;
// die Zeitauflösung auf einen Wert < 10, der Windows genehm ist, setzen while (timeBeginPeriod(TimePeriod) = TIMERR_NOCANDO) and (TimePeriod < 10) do Inc(TimePeriod);
Delphi-Quellcode:
3.
if TimePeriod <> 10 then
timeEndPeriod(TimePeriod); Thread erzeugen, der zeitkritischen Arbeit ausführen soll (das ist das Schnellste, was geht)
Delphi-Quellcode:
4.
MyThread := TMyThread.Create(True);
MyThread.Priority := tpTimeCritical; in Loop vom Thread auf keinem Fall
Delphi-Quellcode:
oder
Sleep(1);
Delphi-Quellcode:
oder etwas ähnliches vergessen, um Windows Luft zum Atmen zu lassen
WaitForSingleObject
Ich hoffe, es hilft. |
Re: beep oder windows.beep()
Im letzten Kasten fehlt
Delphi-Quellcode:
Viele Grüße
WaitForSingleObject
|
Re: beep oder windows.beep()
Was ist das, bitte? Fehlendes Semikolon?
Delphi-Quellcode:
WaitForSingleObject(..);
|
Re: beep oder windows.beep()
Danke, erst mal so auf die schnelle.
muß mir alles in ruhe anschauen. Falk |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz