Вызов события нажатия кнопки из другого потока - C#

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

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

Всем доброго времени суток)Ребят, помогите решить проблему!Суть моей программки проста, нужно прикрутить голосовое управление(оно прикручено и работает отлично), но суть проблемы встала вот в чём, есть класс Speech в нём происходят некоторые действия и по итогам распознания команды должны выполниться соответствующие действия, то есть в конце ниже приведенного кода есть метод "l[i].PerformClick()", который должен вызвать событие нажатия кнопки, параметры которой передаются через массив "l". Я проверял действия других событий в этом коде, таких как звук например, всё работает как надо, но вот с вызовом события нажатия определённой кнопки у меня затык(помогите решить пожалуйста...
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Drawing;
  5. using System.Linq;
  6. using Microsoft.Speech.Recognition;
  7. using System.Media;
  8. using System.IO;
  9. using System.Globalization;
  10. using System.Threading;
  11. using System.Windows.Forms;
  12. namespace Project
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent()
  19. List<object>mass=new List<object>();
  20. for(int i=0;i<Controls.count;i++)
  21. {
  22. mass.add(Controls[i]) ;
  23. }
  24. Speech sp = new Speech();
  25. sp.rech(new MyClass().izvlechenie_button(mass));
  26. }
  27. private void button6_Click(object sender, EventArgs e)
  28. {
  29. Application.Exit();
  30. }
  31. }
  32. class MyClass()
  33. {
  34. public List<Button> izvlechenie_button(List<object>mass)
  35. {
  36. List<Button> mass1 = new List<Button>();
  37. for(int i=0;i<mass.Count;i++)
  38. {
  39. if(mass[i].GetType() == typeof(Button))
  40. {
  41. mass1.Add((Button)mass[i]);
  42. }
  43. }
  44. return mass1;
  45. }
  46. }
  47. Class Speech
  48. {
  49. static Button[] l;
  50. public void rech(Button[] bb)
  51. {
  52. l = bb;
  53. string[] mass = new string[bb.Length];
  54. for (int i = 0; i < mass.Length; i++)
  55. {
  56. mass[i] = bb[i].Text;
  57. }
  58. CultureInfo ci = new CultureInfo("ru-ru");
  59. SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci);
  60. sre.SetInputToDefaultAudioDevice();
  61. sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_spichrecoding);
  62. Choices numbers = new Choices();
  63. numbers.Add(mass);
  64. GrammarBuilder gb = new GrammarBuilder();
  65. gb.Culture = ci;
  66. gb.Append(numbers);
  67. Grammar g = new Grammar(gb);
  68. sre.LoadGrammar(g);
  69. sre.RecognizeAsync(RecognizeMode.Multiple);
  70. }
  71. static void sre_spichrecoding(object sender, SpeechRecognizedEventArgs e)
  72. {
  73. if (e.Result.Confidence > 0.7)
  74. {
  75. for(int i=0;i<l.Length;i++)
  76. {
  77. if(l[i].Text == e.Result.Text)
  78. {
  79. l[i].PerformClick();//ошибка здесь
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }

Решение задачи: «Вызов события нажатия кнопки из другого потока»

textual
Листинг программы
  1. Action action = () => {
  2. for(int i=0;i<l.Length;i++)
  3. {
  4. if(l[i].Text == e.Result.Text)
  5. {
  6. l[i].PerformClick();//ошибка здесь
  7. }
  8. };
  9. Invoke(action);

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


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

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

13   голосов , оценка 3.615 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы