Автор Гілка: Обмін повідомленнями між потоками  (Прочитано 3324 раз)

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Привіт усім хто ще не спить.
Програма написана на gtk в якій виконується деякий фоновий поток, необхідно зробити взаємодію основної програми із фоновим потоком: фоновий поток посилає періодично дані основні й програмі вона відповідно реагує на це.  У мене питання: як за допомогою GLib чи іншими засобами зробити це. В документації по GLib знайшов щось типу  g_signal... g_connect, але нема прикладів; тому незрозуміло як воно реалізується. Буду вдячний за відповіді.
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Обмін повідомленнями між потоками
« Відповідей #1 : 2007-10-22 17:19:08 »
Якщо потік - прямий нащадок основної програми - робити можна всілякими там колбеками, або зовнішніми змінними-прапорцями (пам'ять же спільна).  А якщо - двоюрідний родич - там вже складніше (не знаю як, ніколи не робив - самому буде цікаво, що розумні люди скажуть) .  Якщо це ви розпитуєте про індикатор стану програми (Progress bar) -- не випендрюйтесь - ставте його на таймер і щотіка опитуйте стан фонового процесу . Пробував якось керувати такою штукою прямо з фонового - отримав облизня : не хотіло перемальовуватись.


Yahoo-o-o-o! Це - мій ювілейний 500-ий допис  8-)
« Змінено: 2007-10-22 17:21:14 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Обмін повідомленнями між потоками
« Відповідей #2 : 2007-10-22 17:30:26 »
Куріть gobject. Приклади можна знайти в сирцях gtk-програм.

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Обмін повідомленнями між потоками
« Відповідей #3 : 2007-10-22 22:50:57 »
Цитата
Якщо це ви розпитуєте про індикатор стану програми (Progress bar) -- не випендрюйтесь - ставте його на таймер і щотіка опитуйте стан фонового процесу .
Програма зчитує інфрмацію із деякого пристрою підключеного СОМ порту, необхідно робити це в окремому потоці, і відображати стан читання даних. Таймер поставити не вдастся тому що дані можуть і не читатись, також потрібно відображати кількість считаних даних.

Цитата
Куріть gobject. Приклади можна знайти в сирцях gtk-програм.
Дякую за пораду, зараз спробую.
Чи потрібні Україні програмісти, які не знають англійської мови?

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Обмін повідомленнями між потоками
« Відповідей #4 : 2007-10-23 16:40:48 »
Таймер поставити не вдастся тому що дані можуть і не читатись, також потрібно відображати кількість считаних даних.

Чесне слово, ви явили диво: як то таймер не поставився?
gtk_timeout_add (100, progress_timeout, pdata); написати важко? В стандатному GTK tutorial є приклад progressbar так от ваш progress_timeout () посто має оптати фоновий процес (фоновий процес змінює глобальну змінну, або змінну, на яку progress_timeout () має пойнтер (отримав з pdata)) керуючись даними опитування progress_timeout () встановлює, в функції gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);, new_val в таке значення , яке відповідає цим даним і все...

Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Markus

  • Дописувач
  • **
  • дописів: 79
  • Карма: +0/-0
  • Програматор
Re: Обмін повідомленнями між потоками
« Відповідей #5 : 2007-10-23 22:56:30 »
Цитата
Чесне слово, ви явили диво: як то таймер не поставився?
Я не явив диво, я явив своє невігластво :). Дається взнаки мій мізерний досвід створення GTK програм.
Дякую за пораду.
Чи потрібні Україні програмісти, які не знають англійської мови?