Прошу прощения за возможный ОФФтоп, есть знатоки C#?

Остальные вопросы по работе с операционной системой Windows
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?

Сообщение selenur »

Есть простой способ получить доступ к элементам формы из любого потока, вот таким способом:

Код: Выделить всё


//***** начало процедуры ******

     this.Invoke((MethodInvoker)delegate {
        //тут твой код
                    
                    });

//***** окончание процедуры ******


Но так делать конечно очень неправильно.......
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Bmax77
Мастер
Сообщения: 400
Зарегистрирован: 13 авг 2013, 11:05
Репутация: 39
Контактная информация:

Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?

Сообщение Bmax77 »

А можно попадробней, в какую процедуру это вставлять
и "тут твой код"
код чего, обработчика порта?
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?

Сообщение selenur »

Bmax77 писал(а):А можно попадробней, в какую процедуру это вставлять
и "тут твой код"
код чего, обработчика порта?
Ну вот упрощенный пример:

Код: Выделить всё

private bool _connected;  //определение необходимости работы потока
private BackgroundWorker _theads; //сам поток

//событие кнопки запуска отдельного потока
private void btStart_Click(object sender, EventArgs e)
{
  _connected = true;
 //Создаем поток, и подключаем к нему процедуру
 _theads = new BackgroundWorker();
  _theads.DoWork += TheadsStart;
 //Запустим поток
  _theads.RunWorkerAsync();
}

//событие остановки потока
private void btStop_Click(object sender, EventArgs e)
{
  _connected = false;
}


//отдельный поток
private void TheadsStart(object sender, DoWorkEventArgs e)
{
   while (_connected)
    {
 

 this.Invoke((MethodInvoker)delegate {

//***** в этих пределах возможен доступ к элементам формы, хотя и нежелателен****
       label1.text = "текущее время:" + datetime;
   //********                 
                    });

   }
 }
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Bmax77
Мастер
Сообщения: 400
Зарегистрирован: 13 авг 2013, 11:05
Репутация: 39
Контактная информация:

Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?

Сообщение Bmax77 »

В общем не знаю по чему но ни какие извращения к положительному результату не привели.
Тогда я принципиально изменил подход.
Нажатие кнопки лишь дает толчек к посылке первой команды в мк, а дальше по каждому приходу в порт Ready, вызывается Invoke, который посылает следующую команду и так до достижения конца буфера с командами.
Вот теперь вроде все заработало правильно, видно как отрабатываются даже самые мелкие шаги.
Ответить

Вернуться в «Прочие вопросы Windows»