Qt top window??
Goto page 1, 2  Next
 
Libroom Forum IndexPocketBookPocketBook Free
AuthorMessage

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 07.01.2014 19:02    

Добрый день!

Решил написать на Qt небольшой минутный таймер по аналогу с вот этим:
http://blog.kowalczyk.info/software/15minutes.html

Основная фишка таймера в том, что по истечении времени, выскакивает радостное окошко программы с сообщением об окончании процесса, вне зависимости от текущего его положения при исполнении (в бэкграунде или в трее).

Для Windows и Kubuntu мне это удалось легко сделать так:

Code:
void MainWgt::onTop() {
    showNormal();
    activateWindow();
    raise();
}

Ну или более жестко (через флаги окна) так:

Code:
setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint);
    show();


К сожалению, ни один из этих способов для PocketBook не работает, окошко на самый верх (например, при чтении книги) не выскакивает.

Мне пришлось делать выскакивающее окно слишком тупым способом, запуская вновь новый процесс с этой же программой, а старое окно убивая:

Code:
    QProcess::startDetached ("/mnt/ext1/applications/timer622.app");
    close();


Может быть, кто посоветует, как это сделать правильнее?
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 07.01.2014 21:21    

Window manager'а у нас нет, флаги окна обрабатывать некому.
Ваш способ вполне годный (работает Smile. ). Разве что хардкодить свое имя неизячно Smile
Посмотрите в inkview.h - там должны быть функции управления задачами.

Code:
if (! IsTaskActive()) SetActiveTask(GetCurrentTask(), 0);
- думаю, вы этого хотели.
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 11.01.2014 13:24    

Оо! Спасибо, а это будет работать одновременно с Qt??:

Code:
if (! IsTaskActive()) SetActiveTask(GetCurrentTask(), 0);


У меня как-то не получалось одновременно работать с Qt и inkview - даже с компиляцией были засады. Qt-проект уж очень по своему компилируется.

Кстати, а есть ли варианты прямого "общения" с плугином-платформой, обеспечивающей работу Qt на PocketBook? Например, спросить у него об ориентации экрана или установить оную, или отключить заставку при первой загрузке плугина (не веббраузер же запускаем)

А на счет "хардкодить свое имя неизячно" - ну эт мож быть решаемо так:

Code:
QString fname;
fname  =  qApp->applicationFilePath();


Я пока для первой версии остановлюсь на этом решении.
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 11.01.2014 15:31    

С идеологией qt я слаб, но если указать компилятору
Code:
#include <inkview>

, а линковщику
Code:
-linkview
- этого должно по идее хватить.
Что-то мне кажется, что напоминалка на qt - это атомной бомбой по инфузориям Smile
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 11.01.2014 23:48    

Надо попробовать.
Про "бомбу" я и не спорю, действительно, для Покета Qt-приложения выходят тяжелыми, однако моему мозгу после Perl'а и академического Haskell'а погружаться в Си - тихий ужас.

А так по ходу и Qt/C++ осваиваю (что есть гут Wink ) и уже проект сделал - скоро буду постить!

P.S.: libroom.net/viewtopic.php?p=1124843
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 12.01.2014 21:16    

pal
А Вы часом не подскажите как/(можно ли?), используя inkview, сделать, чтобы на время исполнения приложения (скажем, для того же таймера), приложение не засыпало? Тут Qt увы не поможет Sad
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 10.02.2014 11:45    

pal, как Вы были правы ConfusedSad

Действительно, нормальную напоминалку под Qt для Pocket'а сделать мне оказалось нереально.
Засада вышла в неожиданном месте. HardTimer ведет себя под Qt совершенно невообразимо!!

Мало того, что при описании класса окна пришлось делать странные обертки и сылочные параметры в конструктор окна для обратного вызова хардтаймера (это при моем опыте оказалось слишком нетривиально), но хуже оказалось с поведением самого хардтаймера в связке с Qt!!

Если напоминалка работает в активном режиме, то (умея поддерживать активный режим), все работает как надо, и HardTimer срабатывает тоже нормально.

Если приложение работает в неактивном режиме, то начинаются грабли.
Если пользователь более-менее активно читает, переворачивает страницы, что-то делает еще на Покете, то скорее всего напоминалка сработает более-менее вовремя, и напоминалка всплывет. Если пользователь задумался и читалка засыпает, то начианется самое интересное. При 5-минутной задержке срабатывание будет точным и напоминалка проснется и вовремя всплывет. При установке в 1-4, 6-7 минут, появляются задержки от 30 сек до 4 минут. При установке в 10 мин напоминалка уже может не всплыть сама. Помогает установка системных часов, обновление часов="постоянно", тогда вроде напоминалка просыпается, но опаздывает порой до минуты-полутора.

Однако, когда я сделал консольную (почти Wink) напоминалку drun, то она срабатывала точно.

Сие странно очень Sad

Более того, обновление системных часов тоже происходит нерегулярно. Жесть.
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 10.02.2014 12:43    

Таймеры inkview работают с реальным временем, QT, похоже , с монотонным. Монотонное время тикает, только когда процессор не спит (а спит он практически постоянно).

man 2 clock_gettime
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 10.02.2014 13:52    

pal, я уже отказался от полностью засыпучих Qt-таймеров и задействовал в своей Qt-напоминалке HardTimer из библиотеки inkview. Да и нету в чистом Qt HardTimer'а.

Однако, что-то тут пока нечисто. Срабатывания при засыпании идут с огромной задержкой и всегда почти разной. То ли я hardtimer заюзал криво (а его при описании Qt-сигналов/слотов прямо сложно заюзать), то ли Qt-платформа сама что-то шалит при работе с ним.

А указанный ман он откуда, где есть?? Покетный?
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 10.02.2014 13:59    

manpages-dev в ubuntu.
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 11.02.2014 12:38    

К сожалению, в указанном мане тема таймеров не раскрыта.
Нарыл этот ман:

TIMER_CREATE(2) timer_create - create a POSIX per-process timer (есть пример в мане)

И на русском тут, даже вроде лучше? (если под QNX аналогично нашему случаю):

Применение таймеров (в QNX)
и тут:
Глава 3: Часы, таймеры и периодические уведомления тоже для QNX...

А вот есть более общая инфа:
Инструменты программирования в ядре: Часть 69. Таймеры ядра

еще до кучи
Структура ядра и системные вызовы

Только вот насколько это доступно не из под рута и в нашей платформе??? Rolling Eyes

==================================
Эх, тему бы форкнуть -- в отдельную, про таймеры под PocketBook
Idea
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 11.02.2014 13:44    

Wink

Quote:
int clock_gettime(clockid_t clk_id, struct timespec *tp);

Quote:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};

Quote:
Sufficiently recent versions of glibc and the Linux kernel support the following clocks:

CLOCK_REALTIME
System-wide real-time clock. Setting this clock requires appropriate privileges.

CLOCK_MONOTONIC
Clock that cannot be set and represents monotonic time since some unspecified starting point.


Глубже я не копал Wink
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 11.02.2014 14:52    

pal, а разве clock_gettime не просто функция получения текущего времени?
И как я получу ею время, если книжка уже уснула?
Ктож обеспечит пробуждение?
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 11.02.2014 15:19    

transient
Время, оно разное.. CLOCK_MONOTONIC и CLOCK_REALTIME в частности Wink

Книжка проснется по аппаратному таймеру, который сработает чуть раньше, чем первый софтовый таймер в активном приложении. В неактивном приложении таймеры , можно сказать, не работают.
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 11.02.2014 15:48    

pal, правильно ли я вас понимаю, что как только в своей программке я сделаю запрос clock_gettime, то книжка чудесным образом проснется?? Я что-то не догоняю, а кто ж разбудит мою программку и уснувшую книжку? Активное чужое приложение? А если процессор уснул?

pal wrote:
Книжка проснется по аппаратному таймеру, который сработает чуть раньше, чем первый софтовый таймер в активном приложении. В неактивном приложении таймеры , можно сказать, не работают.


Т.е., аппаратные часы не будят уснувшую книжку? Нужно активное приложение?? Или что означает цитата выше?

С софтовыми таймерами все понятно (про разное "время", примерно тоже). Интересно об аппаратных таймерах, clock_gettime ведь не делает установку таймера, в указанном Вами мане я не нашел про установку аппаратного таймера и его настройку/"обслуживание". Есть в inkview.h, это я знаю.
 
View user's profile ^

pal
Член клуба The eBook

Член клуба The eBook



Joined: 08 Jan 2012
Posts: 1510



Posted: 11.02.2014 16:10    

Если использовать SetHardTimer и прочее из inkview - будет задействован аппаратный таймер (что это за зверь и как им управлять не знаю, но он есть Wink ).
Внутри обработчика таймеров inkview используется clock_gettime - поэтому я и привел тот man.
_________________
Idea Кто хочет действовать, тот ищет возможности, кто не хочет — ищет причины.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 11.02.2014 17:16    

Ясно, печалька Sad
Управление хардтаймерами, SetHardTimer и прочее из inkview мне показалось не слишком прямым. Главное, что инициацию хардтаймеров делает InkViewMain, а как по другому -- я не нашел там. Без InkViewMain'а ставить SetHardTimer бессмысленно, хардтаймер ничего обрабатывать не станет.. В своей утилитке drun я и сделал через InkViewMain, вроде все работает. Только InkViewMain для маленького демона много чего делает лишнего. Но а под Qt пошли уже конкретные грабли, так как там InkViewMain'а не нужно, а как и что там делает Qt-плагин -- неясно, вылазят вышеописанные грабли. Вы было подали надежду, что можно "вкурить" ман и слепить свое управление хардтаймером в виде легковесной библиотеки. Похож, не все так просто.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 02.03.2014 13:03    

pal, я немного разобрался и с CLOCK_REALTIME и с POSIX-ными таймерами.
Мне хочется сделать таймер без использования библиотеки inkvew, чтобы потом его мочь задействовать в Qt-проектах

Вот примерно код, который под декстопом работает как таймер и запускает через 30 сек какой-нибудь процесс:

Code:
#include <pthread>
#include <signal> // косяки с отображением заголовков, должно быть sys/signal.h и т.п.
#include <time>


timer_t timer_id;
int flag = 1;

void timer_thread ()
{
    int status;

//    execl("/usr/bin/geany","/usr/bin/geany", NULL);
    execl("/ebrmain/bin/calc.app ","/ebrmain/bin/calc.app ", NULL);

    exit(0);
}

int main()
{
    int status;
    struct itimerspec ts;
    struct sigevent se;

    se.sigev_notify = SIGEV_THREAD;
    se.sigev_value.sival_ptr = &timer_id;
    se.sigev_notify_function = timer_thread;
    se.sigev_notify_attributes = NULL;

    ts.it_value.tv_sec = 30;
    ts.it_value.tv_nsec = 0;
    ts.it_interval.tv_sec = 0;
    ts.it_interval.tv_nsec = 0;

    status = timer_create(CLOCK_REALTIME, &se, &timer_id);
    status = timer_settime(timer_id, 0, &ts, 0);
//    execl("/usr/bin/geany","/usr/bin/geany", NULL);
//    execl("/ebrmain/bin/calc.app ","/ebrmain/bin/calc.app ", NULL);

    while(1){};

    return 0;
}


однако и он, и его аналоги с демонами-форками -- спят как сурки на ПокетБуке, если не остаются активным приложением. Вот теперь мне стало очень интересно, за счет чего происходит срабатывание будильников на Покете. Т.е. какие (и как) аппаратные, ядерные и может средства inkveiw обеспечивают пробуждение и как ими управлять. Конкретнее, посмотреть бы код HardTimer'а...
 
View user's profile ^

Antuan
Член клуба The eBook

Член клуба The eBook



Joined: 30 Sep 2009
Posts: 11643


Location: Киев

Posted: 02.03.2014 18:55    

transient wrote:
Вот теперь мне стало очень интересно, за счет чего происходит срабатывание будильников на Покете.

По моему все довольно очевидно. В современных SoC в обязательном порядке есть RTC, и как одна из его функций аппаратный таймер, который выдает прерывание при совпадении определенных условий, к примеру дата/время или обратный счетчик достиг нуля, часто таймеров бывает несколько. В книге во время простоя процессор отключается, т.е. она не может обрабатывать программные прерывания, и просыпается она только от аппаратных. Среди них, получение сигнала прерывания от клавиатуры, watchdog-таймера, RTC или аппаратного таймера, или от других аппаратных устройств, которым нужен высокий приоритет при обработке их действий.
То что ПБ называется HardTimer и есть аппаратный таймер, т.е. в регистр таймера записывается определенное значение, которое будет постоянно уменьшаться и при достижение нуля, книга проснется( если спит) и управление будет передано обработчику прерываний - HardTimer.
Конкретная реализация HardTimer зависит от SoC.
_________________
PB 360° (v.15.3) | PB Pro 602 Grey (v.2.2.1a fastdrv) | PB A7 (v.1.3.1583) - подарок от PocketBook.
 
View user's profile ^

transient
Кандидат в члены клуба The eBook

Кандидат в члены клуба The eBook



Joined: 10 Mar 2012
Posts: 310



Posted: 02.03.2014 21:02    

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

1. я за истекший месяц проштудировал доступную литературу (частично выше ссылки я дал) по наводке от pal'a — про CLOCK_REALTIME и часы и таймеры реального времени. Как правило, в них упоминается и RTC (и оно есть часть ядра современного Линуха). Поэтому, в общем, я надеялся, что общими Си-шными либами с темой справиться смогу.

2. Оказалось, что ньюансы действительно есть, и возможно все подобно тому, как Вы описали.
Мне вообще интересно, как описать этот "сон книжки" в деталях. Насколько отключается процессор при засыпании — по крайней мере, насколько для активного приложения и неактивного (или при засыпании нет разницы между ними??) (например, в inkview есть GoSleep (int ms, int deep), которая указывает (??) глубину засыпания, и есть GetSleepmode, которая вроде как из "заснутого" состояния должна вернуть что-то...) И кстати, если процесс не активен, то он спит и в "не спящей" книжке, т.е. процессор может работать, а неактивный (в бэкграунде) процесс уже спит. Так что тут вопросов еще хватает!

3. Начался-то мой интерес из-за того, что во-первых ради запуска хард-таймера надо запускать тяжкий InkViewMain (без него инициации таймеров не будет), а во-вторых под Qt эта технология все-равно глючит. Я решил исследовать технологию аппаратных таймеров, по крайней мере в том, что открыто для доступа и чтения. Мне хочется вытащить из inkview хард-таймер или сделать что-то подобное в отдельной легкой либе, по крайней мере изучить этот код. Но ведь никто не даст Sad

4. Я нашел еще кое-что про общее управление энергосбережением и функции времени arm-процессоров:

http://free-electrons.com/doc/power-management.pdf
http://free-electrons.com/kerneldoc/latest/DocBook/kernel-api/clk.html

Ну или к исходникам OpenInkPot: http://morgue.openinkpot.org/

Однако, похоже сильно много времени надо на изучение этого, а к решению проблемы может и не приведет. Ну либо надо искать другой путь работы с Qt и HardTimer'ом. В общем, для меня оказалось плохо, что либа закрытая и доков на нее почти нет.
 
View user's profile ^
Libroom Forum IndexPocketBookPocketBook FreeAll times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

© Libroom, 2021