LINUX.ORG.RU

Вызов метода из другого потока


0

0

Есть .so библиотека. В ней класс. По вызову функции класса создаётся поток btnreadthread с циклом, в котором происходит периодическое чтение регистра USB устройства - код нажатой кнопки.

Есть GUI-шная прога. В ней создаётся объект того самого класса.

Задача - из потока (btnreadthread) отправлять сообщения в основной поток GUI-ной проги о том что кнопка нажата, ну и вызывать соответствующую функцию.

В GUI проге создавать никаких потоков ради получения этого сообщение, ясен пень, не надо. А получать каким-то способом надо. Первое что приходит в голову - D-Bus, но с ним дело ещё не имел. Читал инет, смотрел API. Насколько понял, GUI-ная прога (Qt \ GTK) имеет свой D-Bus адрес. Т.е. надо по это адресу отправлять сообщения, из потока btnreadthread. Если я не ошибаюсь и такой вариант считается нормальным - подскажите, как получить адрес... или что делать в противном случае. :-)

Можно, например, пайпом обойтись, поток будет в него писать, гуйня в мейнлупе ждать данных в селекте/полле (должно быть в тулкитах). DBus здесь перебор, как по мне. Еще вариант, в libusb1 есть асинхронные операции -http://libusb.sourceforge.net/api-1.0/group__asyncio.html, но тогда либу надо выбросить, и я не помню, есть ли libusb1 в ленни (это ж для него, да?)

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

Мейн луп мне не доступен.

class csltrayApp : public QApplication ... csl70app = new csltrayApp(argc, argv); csl70app->exec();

Т.е. главный цикл берёт на себя Qt, при exec().

ЗЫ - да, для Lenny. Libusb1 как раз и использую, но вся работа с устройством идёт в библиотеке - много наворотов, и контроль отдавать куда-то чревато проблемами.

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

я написал по памяти, у меня потоки через систему сигналов-слотов общаются.

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

А если GUI на GTK, или ещё чём-нибудь другом? Хочется сделать так, чтоб библиотеку подключил, создал объект и передал ему указатель на функцию (метод) которая будет вызываться (или что-то в этом роде). Т.е. человек при подключении библиотеки должен как можно меньше возиться с тем чтобы получать возможность принимать сообщение о нажатии кнопок.

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

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

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

Представьте, что вы подключаете библиотеку для работы со сканером. Библиотека, помимо всего прочего, позволяет вам узнать что на нём нажата кнопка. Так вот если ради того чтоб узнать, что на сканере нажата кнопка, придётся писать кучу «букв», т.к. разработчик библиотеки не позаботился об удобстве, будет много чертыханий. Не хочу делать привязку ни к Qt, ни к GTK, т.к. не знаю ещё на чём буду окончательное ГУИ писать, а может и другому челу эту задачку подкину. (что пример сверху привёл на Qt - временный вариант) Пока что увидел только один универсальный способ взаимодействия - через d-bus. Но тут надо ещё разбираться немало, что к чему.

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

Какой dbus, побойтесь бога. Я описал как это можно сделать. Самописная очередь из 20 строк кода. Методы вида wait_event, check_event. Это быстро, просто и понятно. Чертыхания как раз будут от dbus-а, который является средством МЕЖПРОЦЕССНЫХ коммуникаций а не межпоточных.

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

Очередь - это понятно. Но она уже есть, насколько понимаю. Пример с Qt уже писал:

[code] class csltrayApp : public QApplication ... csl70app = new csltrayApp(argc, argv); csl70app->exec(); [/code].

Т.е. надо вклинить новый вид событий, в эту очередь.

Ещё пришла одна мысль - а нельзя-ли эмулировать нажатие какой-то «необычной» кнопки, допустим на клаве ? Т.е. достаточно будет в GUI-шном классе в функции обработки нажатия клавиш, учесть, что нажата клавиша с таким-то кодом, который будет соответствовать кнопке нажатой на сканере.

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

По таймеру-то работает - переменную читаешь и всего делов. Хочется именно событие.
Кроме B-Dus можно ещё на голым Иксах - но там ещё ужасней. На данный момент задача по вызову метода в основном потоке перекладывается на юзера. В Qt решается это просто:

Signals and Slots Across Threads.
...
With queued connections, the slot is invoked when control returns to the event loop of the thread to which the object belongs. The slot is executed in the thread where the receiver object lives.

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

а нельзя-ли эмулировать нажатие какой-то «необычной» кнопки, допустим на клаве

У меня другая мысль была - а точно эта кнопка на сканере не через HID сделана? Потому что HID и есть кнопка, в принципе, для нее будет /dev/input/че-то-там, и обрабатывать ее можна именно как кнопку (только я не знаю как, но идея именно в этом). Если сканер сделан нормально, то там должен быть HID, например у меня на внешней юсб-звуковухи кнопки громкости - обычный HID, и обрабатываются они как мультимедия-клавиши. Но конечно производители бывают разные, у некоторых фантазия очень богатая.

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