PC Speaker

0

Chodzi o uruchomienie PC Speakera tak, że wywołuje jedno polecenie i PC Speaker zaczyna wydawać dźwięk nieustannie, a potem innym poleceniem go wyłączyć. W ten sposób działa polecenie Sound(f) i NoSound w Turbo Pascalu.

Jedyne, co znalazłem, to takie strony:
http://www.geekpedia.com/code118_Beep-In-The-PC-Speaker.html
http://sharpertutorials.com/beeping-the-pc-speaker-in-c/
http://www.codeguru.pl/article-462.aspx

Na każdej chodzi o to samo, czyli uruchomienie "Beep" z Kernel32.dll. Okazuje się, że to nie odpowiada moim potrzebom z dwóch powodów:

  1. Czas wydawania dźwięku musi być z góry określony
  2. W czasie grania, praca programu jest wstrzymana w miejscu wywołania procedury, a jak przestanie grać, to program wykonuje się dalej

Jak zmusić PC Speaker do grania w tle i przez nieokreślony czas? Innymi słowy, chodzi o odpowiednik (pod względem działania) instrukcji Sound(f) i NoSound z Turbo Pascala.

0

http://msdn.microsoft.com/en-us/library/4fe3hdb1.aspx a jak nie chcesz zatrzymania wrzuć w wątek .
za długość gry odpowiada duration.

0

Spróbowałem, procedura Console.Beep działa praktycznie tak samo, jak podana przeze mnie w pierwszym poście.

Próbuję z wątkami, wydaje sie działać, ale to jeszcze nie do końca działa tak, jak potrzebuję.

Napisałem testowy program, w którym jeden przycisk włącza, a drugi wyłącza dźwiek

        int SndFreq = 500;

        Thread Snd;

        public Form1()
        {
            InitializeComponent();
            Snd = new Thread(SoundWork);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SoundOn();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            SoundOff();
        }

        private void SoundWork()
        {
            //Console.Beep(SndFreq, 2147483647);
            Console.Beep(SndFreq, 10000);
        }

        private void SoundOn()
        {
            Snd.Start();
        }

        private void SoundOff()
        {
            Snd.Abort();
            Console.Beep(SndFreq, 1);
        }

Jak się kliknie Button1 i będzie dźwięk, to powinien być przez 10 sekund, ale jak się wcześniej kliknie Button2, to dźwięk powinien się przerywać.

Niby działa, ale problem polega na tym, że jak dźwięk był przerwany, to jak si zamknie program, to proces zostaje w systemie, i procedura generowania dźwięku jakby trwa przez zdefiniowany czas. Potem, jak się kliknie Button1, to dźwięk rozlega się krócej, czyli przez 10 sekund minus czas miedzy pierwszym kliknięciem a drugim kliknięciem Button1. To tak, jakby Snd.Abort (przerwanie wykonywania wątku) nie działało do końca prawidłowo.

Jak ten problem rozwiązać?

0

Ustaw właściwość Background wątku na true.

0

i to jest wlasnie obiektowosc w dziesiejszych czasach.

//nie bijcie, ja tylko zrozumialem, ze sa ludzie ktorzy wiedza i ludzie ktorzy przeczytali kilka ksiazek

1 użytkowników online, w tym zalogowanych: 0, gości: 1