LINUX.ORG.RU

>Можно ли как нибудь совместить GTK+ с многопоточным программированием?

Можно

Как это можно реализовать?

Почитать про GThread. И, важно - под X11 в потоке перед каждым вызовом gtk_* функций ставь gdk_threads_enter(), после - gdk_threads_leave().

Функции (потоки) принимают только один параметр, что ей передавать?

Что хочешь, то и передавай. Как правило некий указатель на некую сущность (как правило - структуру)

yoghurt ★★★★★
()

можно. для инициализации делаем вот так:

g_thread_init (NULL);
gdk_threads_init ();
gdk_threads_enter ();
gtk_main ();
gdk_threads_leave ();

для выполнения gui-кода из другого потока делаем вот так:

gboolean mycode(gpointer data) {
    gtk_entry_set_text (GTK_ENTRY(data), "hello!");
    return FALSE;
}
...
// add mycode call to gtk main loop queue
g_idle_add (mycode, data);
...

waker ★★★★★
()
Ответ на: комментарий от yoghurt

> перед каждым вызовом gtk_* функций ставь gdk_threads_enter(), после - gdk_threads_leave().

это не работает под вендой, а под линухом работает хреново, и вообще всячески портит жизнь.

waker ★★★★★
()
Ответ на: комментарий от waker

>это не работает под вендой, а под линухом работает хреново, и вообще всячески портит жизнь.

Под линуксом это работает нормально. А кого е**т винда на сайте про линакс?

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

> Под линуксом это работает нормально.

у этого способа куча побочных-эффектов, я в deadbeef сначала так делал, потом переделывать пришлось.

А кого е**т винда на сайте про линакс?

это было написано на всякий случай, вдруг ТСу нужно и под виндой тоже.

waker ★★★★★
()
Ответ на: комментарий от yoghurt

в моем случае, случайным образом происходили race conditions между gtk main loop и моими потоками, происходили зависания. эта проблема не специфична именно для gtk, просто с этим lock/unlock надо быть очень осторожным, и он все равно может повести себя непредсказуемо.

одно время я даже думал что это в самом гтк какие-то жуткие баги с многопоточностью, что он виснет на ровном месте. короче, очень трудно потом эти зависания отлаживать. лучше не связываться.

waker ★★★★★
()
Ответ на: комментарий от yoghurt

Примеры можно? Не сталкивался

Я конкретных примеров не скажу, но тоже натыкался при разработке snaked. Проявляется как случайное зависание приложения.

Решил также — постингом тасков, работающих с ui, в главный цикл через idle.

baverman ★★★
()
Ответ на: комментарий от baverman

Так в питоне ж зеленые потоки, разве нет? Тогда для гтк вообще должно быть до лампочки, ибо фактически все вызовы идут с одного нативного потока, емнип

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Так в питоне ж зеленые потоки, разве нет?

Нет, там обычные потоки с GIL.

baverman ★★★
()
Ответ на: комментарий от Deleted

> пользую в gsql. полет нормальный.

оно может работать нормально до поры до времени. пока не сломается :) т.е. я не возьмусь утверждать, что оно не работает вовсе. оно работает. просто у него побочные эффекты - см. выше.

а от ваших УМВРов мне не легче :)

waker ★★★★★
()
Ответ на: комментарий от waker

> просто у него побочные эффекты - см. выше.

не в УМВР дело. просто это действительно вполне юзабельная вещь, если ей правильно пользоваться. артефакты и прочая неадекватность в поведении лишь следствие некорректного использования. а так... дело вкуса на самом деле.

Deleted
()
Ответ на: комментарий от Deleted

> следствие некорректного использования

бесспорно. просто этот метод слишком просто использовать некорректно, и слишком трудно использовать корректно. в некоторых ситуациях придется городить огромных размеров костыли, чтобы избежать зависонов. и при этом оно все равно не заведется на других os :)

в общем, я не вижу смысла использовать это. а так - да, дело вкуса.

waker ★★★★★
()

Можно ли как нибудь совместить GTK+ с многопоточным программированием? Как это можно реализовать?

SWT

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

Спасибо всем огромное, даже не думал что либа есть!

yandzee
() автор топика
Ответ на: комментарий от iZEN

Забаньте этого персонажа, он запарил высирать всякую левизну

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.