Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Gtk#: Gtk.Application.Invoke  (Прочитано 806 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Mixim

  • Автор темы
  • Участник
  • *
  • Сообщений: 114
    • Просмотр профиля
Gtk#: Gtk.Application.Invoke
« : 22 Февраля 2013, 04:26:41 »
Реализую приложение, в котором должны работать два потока: один - это основной поток (поток для GUI), а во втором потоке необходимо опрашивать устройство на com-порту и выводить полученные с него данные на GUI-элемент.
Решил сперва опробовать как вообще работает многопоточное программирование в Gtk#, для чего написал следующий код:

Thread backgroundThread;
protected void OnButton1Clicked (object sender, EventArgs e)
{
backgroundThread=new Thread(thread_Process);

backgroundThread.Start();

}


private void thread_Process ()
{
for (Int32 i=0; i!=10; i++)
{
Gtk.Application.Invoke (delegate {
entry1.Text = entry1.Text+ i;
                                        }
);

//Thread.Sleep(1000);
}

}
Ожидал в entry1 увидеть: "0123456789", но получил: "10101010101010101010". Как понимаю, такое произошло из-за того, что значение переменной i еще не сохранилось в поле Text объекта entry1, но измениться уже изменилось (i++). Немного исправил:
for (Int32 i=0; i!=10; i++)
{
String val=i.ToString();

Gtk.Application.Invoke (delegate {
entry1.Text = entry1.Text+ val;
                                        }
);

//Thread.Sleep(1000);
}
Получил ожидаемый результат: "0123456789", но скромно считаю, что это не самое удачное решение, т.к. 10 раз выделять память под переменную val - это слишком (допустим, что итераций цикла не 10, а 10000 - памяти немало уйдет).
Как можно видеть, и в первом и во втором коде закомментирована строка Thread.Sleep(1000), т.е. усыпить поток на 1 секунду, но это также не решает проблемы.
Подскажите пожалуйста, каким образом можно более рационально решить указанную задачу, т.е. как не тратя лишней памяти получить на выходе корректный результат?

 

Страница сгенерирована за 0.015 секунд. Запросов: 22.