Вызов события нажатия кнопки из другого потока - C#
Формулировка задачи:
Всем доброго времени суток)Ребят, помогите решить проблему!Суть моей программки проста, нужно прикрутить голосовое управление(оно прикручено и работает отлично), но суть проблемы встала вот в чём, есть класс Speech в нём происходят некоторые действия и по итогам распознания команды должны выполниться соответствующие действия, то есть в конце ниже приведенного кода есть метод "l[i].PerformClick()", который должен вызвать событие нажатия кнопки, параметры которой передаются через массив "l". Я проверял действия других событий в этом коде, таких как звук например, всё работает как надо, но вот с вызовом события нажатия определённой кнопки у меня затык(помогите решить пожалуйста...
using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using Microsoft.Speech.Recognition; using System.Media; using System.IO; using System.Globalization; using System.Threading; using System.Windows.Forms; namespace Project { public partial class Form1 : Form { public Form1() { InitializeComponent() List<object>mass=new List<object>(); for(int i=0;i<Controls.count;i++) { mass.add(Controls[i]) ; } Speech sp = new Speech(); sp.rech(new MyClass().izvlechenie_button(mass)); } private void button6_Click(object sender, EventArgs e) { Application.Exit(); } } class MyClass() { public List<Button> izvlechenie_button(List<object>mass) { List<Button> mass1 = new List<Button>(); for(int i=0;i<mass.Count;i++) { if(mass[i].GetType() == typeof(Button)) { mass1.Add((Button)mass[i]); } } return mass1; } } Class Speech { static Button[] l; public void rech(Button[] bb) { l = bb; string[] mass = new string[bb.Length]; for (int i = 0; i < mass.Length; i++) { mass[i] = bb[i].Text; } CultureInfo ci = new CultureInfo("ru-ru"); SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_spichrecoding); Choices numbers = new Choices(); numbers.Add(mass); GrammarBuilder gb = new GrammarBuilder(); gb.Culture = ci; gb.Append(numbers); Grammar g = new Grammar(gb); sre.LoadGrammar(g); sre.RecognizeAsync(RecognizeMode.Multiple); } static void sre_spichrecoding(object sender, SpeechRecognizedEventArgs e) { if (e.Result.Confidence > 0.7) { for(int i=0;i<l.Length;i++) { if(l[i].Text == e.Result.Text) { l[i].PerformClick();//ошибка здесь } } } } } } }
Решение задачи: «Вызов события нажатия кнопки из другого потока»
textual
Листинг программы
Action action = () => { for(int i=0;i<l.Length;i++) { if(l[i].Text == e.Result.Text) { l[i].PerformClick();//ошибка здесь } }; Invoke(action);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д