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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Плагины/индикаторы для индикации статуса синхронизации с Yandex-disk  (Прочитано 935339 раз)

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

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
Лучше в /usr/local/lib :)   Хотя... Чуть позже проверю обычный симлинк в /usr/lib

Кстати, судя по выхлопу ldd используется только библа libqtdrv.ui.so.1. Есть ли смысл в остальной кучке симлинков? Может переименовать libqtdrv.ui.so.1.0 в libqtdrv.ui.so.1:(
(Нажмите, чтобы показать/скрыть)


Пользователь добавил сообщение 17 Января 2018, 03:54:34:

Побаловался с библиотеками и вот что выходит. У меня получилось 2 варианта.

1-й вариант:
  • Выкинул лишние симлинки, переименовал библу в libqtdrv.ui.so.1 и скопировал в /usr/local/lib.
  • В папке /etc/ld.so.conf.d создал файл local-lib.conf как и описывал ранее со строкой /usr/local/lib, после чего обновил кэш командой ldconfig
2-й вариант:
  • Просто скопировать библиотеку под именем libqtdrv.ui.so.1 в /usr/lib
Симлинк закинуть в /usr/lib можно, но он удалится как только ldconfig обновит кэш.
После обоих способов программа цепляет библиотеку.
« Последнее редактирование: 17 Января 2018, 11:59:32 от Zirrald »
Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
А я вчера накопипастил код из gtk версии ... и получил SEGFAULT выпадение программы... Ожидаемо, т.к. у меня там 3-4 горутины крутятся. А "подстилки" для обновления GUI из одного потока в библиотеке нет.... Придётся делать самому... :(

Пользователь добавил сообщение 17 Января 2018, 10:40:45:
УУУУуу... как все запущенно в Qt с много-поточностью... :o :idiot2: :o :o :o

Любой код запущенный в новой горутине (не важно обновляет он GUI или нет) вываливает программу по SEGFAULT. :o >:(

Даже простой запуск внешнего процесса (если ждать результата) - падаем. Но вот если запускать асинхронно (просто запустить и забыть) то - все нормально.

Проблема в том, что мне нужно от yandex-disk по-любому результат получить и значит от запуска внешнего процесса мне нужен результат. Так что, даже если все переписать на таймеры и один поток (как это сделано в конечном счете в yandex-disk-indicator) то с Qt так не пройдет... :-\

Надо как-то разрулить эту хрень... надо копать дальше...

Пользователь добавил сообщение 17 Января 2018, 15:45:52:
О, оказалось, что валит именно вызов подпроцесса с ожиданием завершения. Именно в process.wait() происходит выпадение после ошибки вызова какаго-то syscall-а.... :o

Т.е. трабла не в горутинах, а именно в ожидании окончания вызванного суб-процесса....

Причем от этого ожидания до Qt-шного GUI - как до луны пешком. Как оно там пересеклось - уму не растижимо !!! (в других программах и с GTK же все работает нормально с этим ожиданием).

Пользователь добавил сообщение 17 Января 2018, 23:14:59:
Короче там похоже какая-то петрушка с сигналами и обработчиками.

Похоже syscall-ы из process.wait() как-то не дружат с обработчиком сигналов в goqt... завел ишью на гитхабе... но там в проекте goqt много ишью весит без ответов.... шансов не много, что это поможет...
« Последнее редактирование: 18 Января 2018, 12:33:18 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Короче вот что накопал:

Сигнал 17 - это в Linux SIGCHLD - сигнал информирующий родительский процесс о том, что дочерний процесс завершился или его исполнение было прервано.
В штатной ситуации этот сигнал должен игнорироваться.

Более того именно с этим сигналом работает waitpid() используемый в go-шном process.wait(). Он по сути просто блокирует свое исполнение и возобновляет его по получению SIGCHLD от процесса PID которого в функцию передали параметром.

Что по факту имеем:

1. без goqt все работает правильно, т.е. дефолтный обработчик SIGCHLD отрабатывает как надо и process.wait() работает с SIGCHLD как положено.

2. goqt (насколько я понимаю) устанавливает (в С-шном коде) свой набор обработчиков сигналов для текущей задачи (есть такой механизм с альтернативным стеком обработчиков) и вот в этом стеке нет обработчика для SIGCHLD судя по сообщению:
signal 17 received but handler not on signal stack
fatal error: non-Go code set up signal handler without SA_ONSTACK flag

SIGCHLD обычно не обрабатывается сразу, по сути это даже не сигнал, а сообщение: когда приходи SIGCHLD от дочернего процесса в родительском он просто вешается в очередь. И вот как раз при обработке process.wait() (в waitpid()) SIGCHLD от дочернего процесса и высвобождается через syscall. В штатной ситуации waitpid() как раз и получает SIGCHLD через обработчик, но порушенный из goqt обработчик пробрасывает SIGCHLD мимо waitpid(). Ну, а дальше необработанный сигнал штатно валит всю программу.
---------

Ну в итоге: что происходит - понятно, как лечить - пока нет.

Пользователь добавил сообщение 18 Января 2018, 18:31:11:
Короче накопол воркараунд.... точнее сказать костыль  :-\

Костыль заключается в том что-бы самому впихнуть этот чертов флаг SA_ONSTACK в обработчик SIGCHLD после всех этих Qt-шных инициализаций.

Так и не смог найти/понять: кто там в Qt или в библиотеке goqt перефигачивает обработчики сигналов без этого флага, но GO без этого флага падает, потому что они для нормальных задач выделяют довольно маленький стек в котором обработать сигнал - не реально (сам сигнал - довольно объемная структура). Для решения такой проблемы и служит флаг SA_ONSTACK - он говорит что обработчик сигнала должен пользоваться специальным стеком (не совсем понял: его заранее выделяют или обработчик как-то сам его выделяет или системный стек используется, но не суть).

Так вот, когда Go получает этот сигнал и у него не стоит флаг SA_ONSTACK, то go просто падает, ибо знает, что обработка сигнала в стандартном стеке приведет к еще более неприятному крашу.

Я накопал сишный код, в котором с этим флагом игрались ребята которые с этой проблемой столкнулись еще 2014 году и перелопатил его в простую выставлялку флага существующему обработчику. Засунул вызов этого кода сразу за инициализацией библиотеки - и о чудо - все взлетело.

Так что Qt версия (хоть и на костылях) но похоже встает на ноги :)

Zirrald, скачайте обновы с гита, там я скриптами оформил сборку и установку. Попробуйте запустить в кедах. Если заработает то сделайте мне красивых скриншотов для вики (у меня на крыске qt выглядит очень уродливо).

Пользователь добавил сообщение 18 Января 2018, 19:19:21:
Вобщем виновник - все-таки Qt.

Они там свой обработчик вешают, оригинальный вызывается каскадно.... но вот пока они там все это мудрят - все флаги теряются - нагуглил кучу багрепортов на тему сброса флагов. Go просто наступил на грабли, которые уже истоптали разработчики на Qt.
... пишут вроде как выпилили из Qt5 тот компонент, который так хулиганил, но не факт что этот кривой функционал не перенесли в другие места.
« Последнее редактирование: 18 Января 2018, 19:35:18 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
Sly_tom_cat, а Qt не сдается.. Опять куда-то подменю упрятал  :idiot2:
Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Не. Я уже просто сдаюсь... Я тут уже несколько дней из этого qt не вылезаю... А вся затея с qt была только из за этого чертового подменю... И с одним пунктом добавленным на старте ведь работало же.
А теперь опять двадцать пять...
Но, возможно стоит дополнительно перерисовку меню вызвать... Прикольно другое. У меня на крысе оно показывается без всяких плясок с бубном...

Пользователь добавил сообщение 18 Января 2018, 22:23:29:
Добавил дополнительный вызов Show().

... но почему-то с трудом верю что это поможет... :-\
« Последнее редактирование: 18 Января 2018, 22:23:29 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
Порылся немного с этой же проблемой на питоне. Нашел библиотеку PySide. Нарыл простенький индикатор с этой библой, добавил подменю - работает.


Документацию смотрел тут.

Пользователь добавил сообщение 18 Января 2018, 23:27:26:
Вот еще репка c qt биндами для go - GitHub. Все связанное с сис-треем находится в widgets. Также, возможно, будет полезно почитать ишшью вот тут.
Проект живой, обновления идут и на вопросы отвечают :coolsmiley:
« Последнее редактирование: 18 Января 2018, 23:27:27 от Zirrald »
Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Zirrald, так подменю созданное в самом начале и в моем самом первом коде показывалось.

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

А проблема там в ишью - другая - там человек не подумав в несколько потоков GUI обновлял - от такого и GTK и Qt - крашатся на раз, ибо там практически нет элементов способных обеспечить много-поточное обновление. Там только сообщения отправить в Qt и задачи в main loop GTK подсунуть можно много-поточно.

Но в goqt есть нормальная обертка для того, что бы код отработал в главном потоке - метод ui.Async(f func()) - отдаешь ему функцию и он ее исполнит в главном потоке. У меня так весь GUI и обновляется. Так что трабла с подменю не с многопоточностью связана.

Я там еще немного код изменил. Пробуйте.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
Во! Теперь все как часики :D По клику из подменю тоже открывает.
Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Да библиотека поинтереснее: баиндинг через кодогенератор, а не через какие-то цифровые коды и велосипеды как в goqt, я ее находил, но не смог разыскать там QSystemTrayIcon.... плохо искал...

Можно будет и переделать, тем более, что там в примерах есть использование QSystemTrayIcon.

Надо только понять что нужно будет для деплоя... инсталляция там довольно обширная... и сборка ... еще не понял как, но как-то странно, утилитой, а не go компилятором..... такое (подозреваю) точно на launchpad не соберешь...

Пользователь добавил сообщение 19 Января 2018, 01:08:39:
Во! Теперь все как часики  По клику из подменю тоже открывает.

Ну, блин, отлегло...  я уж думал опять нифига не выйдет с кедами....

В принципе можно yd-qgo - назначить рабочим вариантом, там правда костылик стоит и он на 4-м qt, что уже не очень модно....

Пользователь добавил сообщение 19 Января 2018, 01:12:11:
Как вам уведомления по дизайну? Сделал как сообщения иконки из систем-трея. Просто первое что под руку попалось. Возможно не очень красиво. Можно сделать как в yd-go (gtk-шном) через notify-send...???
« Последнее редактирование: 19 Января 2018, 01:12:11 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
Как вам уведомления по дизайну? Сделал как сообщения иконки из систем-трея. Просто первое что под руку попалось. Возможно не очень красиво. Можно сделать как в yd-go (gtk-шном) через notify-send... ???

Разницы с gtk не заметил.  :o

Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
А как же иконка? ;)

В сообщение qt-шного систрея можно вставить только одну из 4 стандартных иконок. Через notify-send - можно поставит произвольную. Причём в крыске сообщения очень сильно различаются....

Но понятно, это все бантики...
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
Оу.. я то думал там можно свою подставить... Вообще, даже удивительно.
И судя по этому обсуждению подобное можно решить пропатчив qt-шные сырцы, добавив саб класс с распознованием кастомных иконок в функции.

Однако, думаю "бантики" того не стоят ;D

Пользователь добавил сообщение 19 Января 2018, 11:31:40:
В целом, меня и notify-send устраивает 8)
« Последнее редактирование: 19 Января 2018, 11:31:40 от Zirrald »
Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
И судя по этому обсуждению подобное можно решить пропатчив qt-шные сырцы, добавив саб класс с распознованием кастомных иконок в функции.
Да это то - понятно....
... только вот:
Однако, думаю "бантики" того не стоят 
У меня один в один точно такие же мысли на этот счет.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Zirrald

  • Любитель
  • *
  • Сообщений: 84
  • Manjaro KDE
    • Просмотр профиля
К скрипту сборки надо бы еще сборку libqtdrv.ui.so.1 прикрутить.


Пользователь добавил сообщение 19 Января 2018, 12:50:31:
Хотя не.. без этой библы и той кучи симлинков на нее, даже не собирается :(
« Последнее редактирование: 19 Января 2018, 12:50:31 от Zirrald »
Опыт позволяет нам ошибаться гораздо увереннее.

Оффлайн Sly_tom_cat

  • Автор темы
  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Ну, полноценный деплой я пока не прорабатывал ни для yd-go ни для yd-qgo

В целом, по Qt ветке, я пока прорабатываю вариант перехода на github.com/therecipe/qt.

Там более заморочная установка окружения для сборки, но зато создание деплоя продумано разработчиком. Да и баиндинг там сделан прямыми руками в отличии от goqt написанным (по некоторым ощущениям) каким-то индусом из китая  :-\ :crazy2:  ну очень "индусский код"... что слегка напрягает...
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

 

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