Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi beep oder windows.beep() (https://www.delphipraxis.net/11434-beep-oder-windows-beep.html)

falk 6. Nov 2003 15:02


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

Luckie 6. Nov 2003 15:04

Re: beep oder windows.beep()
 
Meinst du du merkst einen Unterschied, den es da an Millisekunden geben könnte? :roll:

falk 6. Nov 2003 15:13

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

flomei 6. Nov 2003 15:25

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:

himitsu 6. Nov 2003 15:37

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)

falk 6. Nov 2003 15:42

Re: beep oder windows.beep()
 
Zitat:

Zitat von himitsu
: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)

Danke für den Tip, da werde ich die Kiste wohl mal aufschrauben.

Falk

Daniel B 6. Nov 2003 15:53

Re: beep oder windows.beep()
 
Zitat:

Zitat von flomei
Bei einem Intervall von 2ms wirst du mit Delphi aber Probleme bekommen.

Mit Windows, nicht mit Delphi. ;)
Delphi kompiliert auch 1ms. :D

Delphianer 6. Nov 2003 16:02

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

Daniel B 6. Nov 2003 16:07

Re: beep oder windows.beep()
 
Erfahrungstechnisch sollte man sich nicht unter 50ms begeben.

falk 6. Nov 2003 16:10

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

Chewie 6. Nov 2003 16:21

Re: beep oder windows.beep()
 
Zitat:

Zitat von Falk
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???

Ein Speaker-Sound wird meines Wissens über einen Interrupt ausgelöst. Ein Interrupt unterbricht die momentane Aktion des Prozessors, es sei denn, der Prozessor arbeitet gerade einen Interrupt mit einem höheren Level ab. Musst mal schauenm, vielleicht findeste irgendwo das IRQ-Level des Speakers.

Delphianer 6. Nov 2003 16:26

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

falk 6. Nov 2003 16:59

Re: beep oder windows.beep()
 
Zitat:

Zitat von Delphianer
@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.

Und was beeinflusst den Start des Beep?? Windows???

Falk

Delphianer 6. Nov 2003 17:06

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

falk 6. Nov 2003 17:40

Re: beep oder windows.beep()
 
@Delphianer

ja läuft unter XP

Falk

Delphianer 7. Nov 2003 15:02

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:
  if SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS) then
  begin
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_IDLE);
  end;
2.
die originale Zeitauflösung von 2000/XP ist auf 10ms gesetzt, deshalb

Delphi-Quellcode:
  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);
und am Schluß wieder zurücksetzen

Delphi-Quellcode:
  if TimePeriod <> 10 then
    timeEndPeriod(TimePeriod);
3.
Thread erzeugen, der zeitkritischen Arbeit ausführen soll (das ist das Schnellste, was geht)

Delphi-Quellcode:
  MyThread := TMyThread.Create(True);
  MyThread.Priority := tpTimeCritical;
4.
in Loop vom Thread auf keinem Fall

Delphi-Quellcode:
  Sleep(1);
oder

Delphi-Quellcode:
  WaitForSingleObject
oder etwas ähnliches vergessen, um Windows Luft zum Atmen zu lassen

Ich hoffe, es hilft.

Delphianer 7. Nov 2003 16:14

Re: beep oder windows.beep()
 
Im letzten Kasten fehlt

Delphi-Quellcode:
  WaitForSingleObject
Viele Grüße

Delphianer 7. Nov 2003 16:16

Re: beep oder windows.beep()
 
Was ist das, bitte? Fehlendes Semikolon?

Delphi-Quellcode:
  WaitForSingleObject(..);

falk 7. Nov 2003 16:47

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