LINUX.ORG.RU

gio, gtkmm signals vs. нити.

 ,


0

2

Подскажите, в каком треде происходит вызов слота в gio? Можно ли этим как-то управлять?

Например “ask-password” signal (https://developer.gnome.org/gio/stable/GMountOperation.html#GMountOperation-a...)

Я попробовал пользоваться gtkmm, но он мне прилетает в другую нить (thrradid в колбэке по крайней мере отличается от того, что я получаю в ните, где я начинаю процедуру монтирования)

★★★★★

Последнее исправление: invy (всего исправлений: 3)

Ну оно внутри использует glib'овские сигналы. Имхо, оно не должно треды создавать, но пруфа найти что-то не могу..

UVV ★★★★★
()

Я попробовал пользоваться gtkmm, но он мне прилетает в другую нить

Так может ты его и ждёшь в другом треде?

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

Я коннекчусь к сигналам GMountOperation, треды не создаю. Запускаются g_file_mount_enclosing_volume. Но когда проверял this_thread::get_id(), то он отличается от того, где я вызываю mount. Может g_main_loop создает нить, а не запускается в текущей...

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

Но когда проверял this_thread::get_id()

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

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

Да, точно. Посмотрел сейчас. У меня 2 треда, один из main(), второй из g_main_loop. Только, если я правильно понимаю, тот что из main блокируется пока main_loop не вернётся.

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

Рассматривается. Но мне нити не нужны в моей задаче от слова совсем. Мне нужно получать коллбэк именно в main thread, спросить юзера логин/пароль и забыть об этом.

Это был бы самый потокобезопасный вариант, потому что в нем бы была только одна нить.

Мне в моей задаче нити не нужны, но мне их похоже навязывают.

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

Вроде бы можно указать контекст и куда будут приходить колбэки ... Вечером потыкаю.

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

Всё гениальное просто...

Glib::MainLoop::create(Glib::MainContext::create(), false);

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

Или нет... оно диспатчер вызывает в нужном треде, но не колбэк.

invy ★★★★★
() автор топика
Последнее исправление: invy (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.