Russian Qt Forum

Qt => Общие вопросы => Тема начата: pakulo от Май 18, 2007, 15:58



Название: Сколько неактивная система
Отправлено: pakulo от Май 18, 2007, 15:58
Мне нужно узнать сколько времени прошло после того как пользователь последний раз двинул мышкой или нажал на кнопку клавиатуры... что бы например через 5 минут после отстутсвия каких-либо действий, программа запускала свою работу (ну например перебор чисел), после того как пользователь вернулся, обратно прекращала свою работу.


Название: Re: Сколько неактивная система
Отправлено: kitov от Май 18, 2007, 16:09
Запускай таймер после перехваченного события ,
если получил событие , презапускай таймер , нет - по
истечении запускай свою задачу .


Название: Сколько неактивная система
Отправлено: pakulo от Май 18, 2007, 21:45
да, это понятно... самый простой способ, но возможно есть какие-нить другие варанты?


Название: Сколько неактивная система
Отправлено: fanat9 от Май 18, 2007, 22:24
Т.е. есть ли уже такой таймер в системе ?
И тебе всё равно нужен свой таймер, чтобы опросить "что-то" через нужный тебе интервал времени =)


Название: Сколько неактивная система
Отправлено: pakulo от Май 18, 2007, 22:36
ясно, будем думать тогда ))


Название: Сколько неактивная система
Отправлено: Gryz от Май 19, 2007, 13:40
Я думаю, что по таймеру надо сравнивать запомненное положение QPoint QCursor::pos ()  с текущим.
Как с клавиатурой быть, что-то сразу в голову не приходит.


Название: Сколько неактивная система
Отправлено: kitov от Май 19, 2007, 14:19
Цитата: "Gryz"
Я думаю, что по таймеру надо сравнивать запомненное положение QPoint QCursor::pos ()  с текущим.
Как с клавиратурой быть, что-то сразу в голову не приходит.


для клавиатуры QKeyEvent , для мыша QMouseEvent и не надо ни какие позиции сравнивать :-)


Название: Сколько неактивная система
Отправлено: Gryz от Май 19, 2007, 15:04
Если ни одно из окон процесса не является активным, т.е. пользователь вообще не видит нашей программы, а работает, например, в "Проводнике", то никаких QKeyEvent и QMouseEvent наша прога не увидит.


Название: Сколько неактивная система
Отправлено: kitov от Май 19, 2007, 15:21
Цитата: "Gryz"
Если ни одно из окон процесса не является активным, т.е. пользователь вообще не видит нашей программы, а работает, например, в "Проводнике", то никаких QKeyEvent и QMouseEvent наша прога не увидит.


Понятно , нужно определить глобальное бездействие .

добавлено спустя 3 минуты:

 Может с помощью QDesktopWidget ?


Название: Сколько неактивная система
Отправлено: Gryz от Май 19, 2007, 16:17
Нет. Думаю, надо смотреть в QCoreApplication

добавлено спустя 13 минут:

 Я так смотрю, что только средствами Qt это никак не сделать...

добавлено спустя:

 Клавиши можно перехватывать платформозависимым путем:

http://sources.ru/builder/faq/041.html
или
forum.sources.ru (http://forum.sources.ru/index.php?act=Search&CODE=show&searchid=fb9eacf4d72321ef67ec93e7aa608eb2&search_in=posts&result_type=topics&highlite=%CF%C5%D0%C5%D5%C2%C0%D2%C8%D2%DC+and+%CD%C0%C6%C0%D2%C8%C5+and+%CA%CB%C0%C2%C8%D8%C8)


Название: Сколько неактивная система
Отправлено: pakulo от Май 19, 2007, 17:14
Хм... оказалось все не так просто... с мышкой в принципе более-менее понятно, можно узнать глобальное положение мышки и постоянно проверять не равно ли оно предидущему... а вот с клавиатурой проблема... какие могут быть мысли?


Название: Сколько неактивная система
Отправлено: Gryz от Май 19, 2007, 17:27
С мышкой когда работаешь, надо засекать время бездействия.

С клавиатурой стандартными средствами Qt - никак.


Название: Сколько неактивная система
Отправлено: Lion от Май 21, 2007, 12:06
В принципе мышки вполне достаточно, одной клавой мало кто работает.


Название: Сколько неактивная система
Отправлено: Gryz от Май 21, 2007, 12:32
Если только много букв не вводит.


Название: Re: Сколько неактивная система
Отправлено: Lion от Март 01, 2008, 22:31
Ничего нового по этой теме не появилось?


Название: Re: Сколько неактивная система
Отправлено: ритт от Март 02, 2008, 03:13
вносил такое предложение Троллям - ответили, что подобное несложно сделать самостоятельно и они этого делать не будут :)


Название: Re: Сколько неактивная система
Отправлено: Вячеслав от Март 02, 2008, 12:15
А отловить системные события ? ScreenSaver'a например - не катит ?


Название: Re: Сколько неактивная система
Отправлено: shadone от Март 03, 2008, 15:08
насколько я знаю для таких целей (ресурсоемкая работа при неактивности пользователя) обычно используется отдельный поток с минимальным приоритетом (idle). Это более-менее кроссплатформенный способ. Иначе можно делать разные хаки для разных ОС (типа глобальный хук в windows).


Название: Re: Сколько неактивная система
Отправлено: ритт от Март 04, 2008, 14:38
если поток с мин.приоритетом, ресурсоёмкая задача будет выполняться _всегда_, но будет жрать минимум процессорного времени во время работы пользователя

а если надо просто разлогиниться через 15 минут неактивности юзверя? не повесишь же это на отдельный поток с айдлом


Название: Re: Сколько неактивная система
Отправлено: Вячеслав от Март 04, 2008, 15:04
А в лоб низя ? QAplication->installEventFilter а в нем ловить
QEvent::KeyPress
QEvent::MouseButtonDblClick
QEvent::MouseButtonPress
QEvent::MouseButtonRelease
QEvent::MouseMove
 и перезапускать таймер ? А по таймеру делать нужное ?


Название: Re: Сколько неактивная система
Отправлено: shadone от Март 04, 2008, 16:11
это будет неактивность только текущего приложения. неактивность всей системы таким образом не отловить.


Название: Re: Сколько неактивная система
Отправлено: Lion от Март 05, 2008, 07:54
вносил такое предложение Троллям - ответили, что подобное несложно сделать самостоятельно и они этого делать не будут :)
Может попросишь их намекнуть с чего начать?


Название: Re: Сколько неактивная система
Отправлено: shadone от Март 05, 2008, 10:33
trolltech очень открытая компания работающая над open-source. и как и в любом другом open-source проекте никто вам не мешает сделать собственный класс и прислать патч. если он будет соответствующего качества то конечно мы его включим в библиотеку.


Название: Re: Сколько неактивная система
Отправлено: ритт от Март 05, 2008, 11:30
пример, http://trolltech.com/developer/task-tracker/index_html?id=192203&method=entry


Название: Re: Сколько неактивная система
Отправлено: shadone от Март 05, 2008, 11:42
пример, http://trolltech.com/developer/task-tracker/index_html?id=192203&method=entry
Вижу два патча, один из них твой. как тебе и ответили - после выхода 4.4 (т.к. таска появилась после 4.4 feature freeze) эта таска будет переназначена. Кстати в январе она уже была назначена на 4.5.
Несмотря на то что патч небольшой, это не тривиальная задача просто применить патч и закоммитить - требуется написать unit-тесты, проверить что этот патч не поломает другие способы загрузки картинок (например из ресурсов, или работу QIcon).


Название: Re: Сколько неактивная система
Отправлено: ритт от Март 06, 2008, 13:03
прекрасно понимаю про тестирование...у меня, к примеру, не открываются svgz-шки, сгенерированные корелом 13 сп1 (причём, ганзип ругается на префикс --)
а что он может сломать, если сначала проверяется сигнатура и, если отсутствует, используется "родной" способ загрузки?

ну, не суть в общем...приоритет 2 уже позволяет рассчитывать на реализацию функционала
я просто привел пример к "если он будет соответствующего качества то конечно мы его включим в библиотеку"


Название: Re: Сколько неактивная система
Отправлено: QCasper от Апрель 01, 2010, 11:23
По этой задаче никто не нашел решения? Пусть даже платформозависимым способом.


Название: Re: Сколько неактивная система
Отправлено: Lion от Ноябрь 13, 2010, 12:17
Вопрос все еще актуален, кто знает решение отпишитесь, пожалуйста.


Название: Re: Сколько неактивная система
Отправлено: Пантер от Ноябрь 13, 2010, 12:22
В psi это есть. Исходники открыты.


Название: Re: Сколько неактивная система
Отправлено: wanick от Апрель 19, 2011, 03:37
Вот примерно что-то такого получается и все работает
Код:
....
#include <windows.h>
....
myclass::myclass()
{
....
    keyControl = new QTimer();
    keyControl->setInterval(1000);
    keyControl->start();

    connect(keyControl, SIGNAL(timeout()), this, SLOT(keyControlEvent()));
    secondSleep = 0;
    curX = QCursor::pos().x();
    curY = QCursor::pos().y();
....
}
....

void myclass::keyControlEvent()
{
    if(curX != QCursor::pos().x() || curY != QCursor::pos().y())
    {
        curX = QCursor::pos().x();
        curY = QCursor::pos().y();
        keyIndex = 256;
    }

    int index = 1;
    while (index < 256)
    {
        unsigned short result = GetAsyncKeyState(index);

        if (result !=  0)
        {
            keyIndex = index;

            while (result != 0)
            {
                result = GetAsyncKeyState(index);
            }
            index = 1;
        }
        index++;
    }

    if(keyIndex == 0)
    {
        secondSleep++;
        if(secondSleep % 60 == 0)
        {
            qDebug(QString("Comp sleep %1 min").arg(secondSleep/60));
        }
    }
    else
    {
        secondSleep = 0;
    }
    keyIndex = 0;

}

только что написал еще ладом не протестировал ,
но сразу вижу 2 минуса,  
1. не работает на Linux
2. не учитывает "полезное бездействие" , например просмотр фильма...

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


Название: Re: Сколько неактивная система
Отправлено: SABROG от Апрель 19, 2011, 11:46
По этой задаче никто не нашел решения? Пусть даже платформозависимым способом.

Вот (http://stackoverflow.com/questions/2482103/getlastinputinfo-equivalent-in-linux-to-detect-last-input-time), может пригодиться.


Название: Re: Сколько неактивная система
Отправлено: wanick от Апрель 19, 2011, 18:09
вот немного переработал и сдела удобнее для использвания
пример использования аналагичен QTimer (в аттаче)
Код:
inactive = new QMInaction;
inactive->setInterval(30);
connect(inactive, SIGNAL(timeout()), this, SLOT(inactiveActon()));
inactive->start();

Недостатки
1. не работает в linux(надеюсь пока)
2. не учитывает событие скрола колесом
3. не учитывает включен ли полезный процесс, например просмотр кинофильма

Что есть
startSignal() - срабатывает при запуске  . вызов метода start()
stopSignal() -  при остановке.  вызов метода stop()

timeout() -  тоже сигнал , срабатывает при достижении нужного времени бездействия(в секундах)
inactiverestart(unsigned short) - сигнал срабатывает при сбросе счетчика когда сработало какое-то действие

пока расширять функционал не планирую,  т.к. для моей задачи то что получилось вполне результативно... может кому пригодится

P.S.  прошу сильно не критиковать т.к. на C++ пишу не более 3-4 дней.