Потоки и события - 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(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д