Страница 2 из 2

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

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

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


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

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

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


Но так делать конечно очень неправильно.......

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

Добавлено: 31 мар 2015, 17:35
Bmax77
А можно попадробней, в какую процедуру это вставлять
и "тут твой код"
код чего, обработчика порта?

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

Добавлено: 31 мар 2015, 21:30
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;
   //********                 
                    });

   }
 }

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

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