Потоки и события - C# (204244)

Узнай цену своей работы

Формулировка задачи:

Добрый день. Вопрос по событиям которые происходят в потоке. Если подписать на событие в главном потоке, то оно вызывается нормально. Если же на него подписаться из потока, то оно даже не вызывается. Куда копать?

Решение задачи: «Потоки и события»

textual
Листинг программы
class VoiceClient
    {
        //сокет отправитель
        private Socket client;
        //поток для нашей речи
        private WaveIn input;
        //буфферный поток для передачи через сеть
        private BufferedWaveProvider bufferStream;
 
        private IPAddress ip;
        private int Port;
        private bool WriteLog;
        LogWriter ErrorLog;
 
        public VoiceClient(bool log = false)
        {
 
            this.WriteLog = log;
            if(WriteLog)
                ErrorLog = new LogWriter("ErrorVoiceClient.log");
        }
 
        ~VoiceClient()
        {
 
            if (client != null)
            {
                client.Close();
                client.Dispose();
            }
 
            if (input != null)
            {
                input.Dispose();
                input = null;
            }
 
            bufferStream = null;   
        }
 
        //Обработка нашего голоса
        private void Voice_Input(object sender, WaveInEventArgs e)
        {
            try
            {
                //Подключаемся к удаленному адресу
                IPEndPoint remote_point = new IPEndPoint(ip, Port);
                //посылаем байты, полученные с микрофона на удаленный адрес
                client.SendTo(e.Buffer, remote_point);
            }
            catch (Exception ex)
            {
                if (WriteLog)
                    ErrorLog.Write(ex.Message);
            }
        }
 
        public void Connect(string ip_, int port_)
        {
            try
            {
                string name=Thread.CurrentThread.Name;
                   
                this.ip = IPAddress.Parse(ip_);
 
                    this.Port = port_;
                    //создаем поток для записи нашей речи
                    input = new WaveIn();
                    //определяем его формат - частота дискретизации 8000 Гц, ширина сэмпла - 16 бит, 1 канал - моно
                    input.WaveFormat = new WaveFormat(8000, 16, 1);
                    //добавляем код обработки нашего голоса, поступающего на микрофон
                    input.DataAvailable += Voice_Input;
                    //создаем поток для буферного потока и определяем у него такой же формат как и потока с микрофона
                    bufferStream = new BufferedWaveProvider(new WaveFormat(8000, 16, 1));
                    //сокет для отправки звука
                    client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                    input.StartRecording();
 
                
            }
            catch (Exception ex)
            {
                if (WriteLog)
                    ErrorLog.Write(ex.Message);
            }
        }
 
        public void Close()
        {
            string name = Thread.CurrentThread.Name;
            if (client != null)
            {
                client.Close();
                client.Dispose();
            }
 
            if (input != null)
            {
                input.Dispose();
                input = null;
            }
 
            bufferStream = null;   
        }
    }
 
VoiceClient Client;
        private void button1_Click(object sender, EventArgs e)
        {
 
 
            Client = new VoiceClient(true);
            Thread thread = new Thread(delegate() { Client.Connect(this.textBox1.Text, 5555); });
 
            thread.Start();
 
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.125 из 5
Похожие ответы