Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
Jan. 16, 2019, 4:43 p.m.

Sleep в приложении для Android

Qt, Android, sleep

Здравствуйте. Сделал Sleep в приложении так:

        QApplication::processEvents();
        QThread::sleep(TimeSleep);

На компьютере работает прекрасно. Но на андройде работает не правильно, какието из потоков тормозятся, какието нет, и приложение работает не верно. Скажите пожалуйста, как сделать сон для приложени.

Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
16

Добрый день!

Если вы про возможность свернуть приложение, то кКуда-то в сторону JNI копать нужно. Там зависимость на Java-машину. Куда именно, увы - не знаю.

0

Задача более тривиальная. Просто менять картинки у кнопки. А у QT нет больше возможностей приостанавливания программы?

0

А вы уверены, что вам именно остановка потока нужна в данном случае? Тем более, если вы стопаете GUI поток, если я правильно понял? Как бы игрушки с GUI потоком и его остановкой могут приводить к остановке программы без её восстановления в дальнейшем.

0

Уверен что это нужно сделать, но не уверен как. Может быть можно приостановить GUI поток используя таймер? Почему GUI поток так уязвим?

0

в GUI потоке обрабатывются все эти виджеты, а также processEvents - это главный поток программы, если вы его останавливаете, то логично, что у вас перестают обрабатываться processEvents. Понимаете? Что это равносильно повешать программу.

Если вам нужно скачать картинку, обработать её или что-то ещё сделать, то для этого лучше создать отдельный поток. Посмотрите статью об использовании moveToThread . Думаю, что это может решить часть ваших пробелм как минимум.

А вообще не ясна суть проблемы без самого кода. Здесь в вашем коде мне представляется, что вы просто стопнули всё приложение. Я бы дал ему работать как обычно, а обработку данных убрал бы в отдельный поток, а потом по сигналу из того потока установил бы картинку на кнопку или что вы там делаете.

0

Код примерно такой:

        ui->Page1Button1->setStyleSheet(BlackButton);
        ui->Page1Button2->setStyleSheet(RedButton);


        ui->Page1Label1->setText("Текст");


    QApplication::processEvents();
    QThread::sleep(2);

    ui->Page1Button1->setStyleSheet(IconButton);
    ui->Page1Button2->setStyleSheet(IconButton);
0

Этот QThread::sleep там вообще никакого смысла не несёт. Что он меняет? По-моему, это абсолютно бесполезный код. Стайлшиты и так прекрасно устанавливаются без каких-либо остановок потока.

0

Все верно, но мне на 2 секунды нужно поменять картинки, а потом вернуть к исходному состоянию. Это решилось для компьютера этим кодом, а вод с андроидм вышла незадача.

0

Если вам так нужно менять цвет иконок ровно через 2 секунды, то используйте QTimer и не трогайте QThread. Это стрельба из пушки по воробьям.

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

0

Но мне бы еще и кнопочки на время сделать нерабочими

0

у вас есть сигналы, слоты, функции. у вас есть методы setEnabled(false); это всё что нужно.

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

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

0

спасибо

1

Сделал, как написанно у вас в роимере. Вместо сна поставил этот код:

    MyTimer = new QTimer();
    connect(MyTimer, SIGNAL(timeout()), this, SLOT(TimerSlot()));
    MyTimer->start(TimeSleep);

Но он почемуто срабатывает не через указанное время, а сначало как нужно, но чем дальше, тем быстрее проходит время ожидания.

0

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

m_timer->setSingleShot(true);

А потом уже вызывайте уже старт таймера тогда, когда это уже действительно нужно.

m_timer->start(timeSleep);

А ускоряться он априори не может. У вас логическая ошибка в коде очевидно в другом месте дополнительно.

P/S/ И рекомендую вам отучиться называть переменные с большой буквы. Не существует такого кодстайла. Придёте работать в серьёзную контору - заставят переучиваться.

0

Спасибо, заработало. Учту с переменными.

0

Для Desktop делал так:

void pause(int ms)
{
    QTimer timer;
    timer.setInterval( qBound(1, ms, 3600000) );
    timer.setSingleShot(true);
    QEventLoop loop;
    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
    timer.start();
    loop.exec();
}
0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
d
April 26, 2019, 2:45 a.m.
djanaibekova_0301@mail.ru

C++ - Тест 003. Условия и циклы

  • Result:42points,
  • Rating points-8
Z
April 25, 2019, 8:02 p.m.
ZadvornyAlexey

C++ - Test 001. The first program and data types

  • Result:60points,
  • Rating points-1
m
April 24, 2019, 2:30 p.m.
maksImkа

C++ - Тест 003. Условия и циклы

  • Result:50points,
  • Rating points-4
Last comments
April 21, 2019, 4:22 p.m.
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
April 21, 2019, 3:48 p.m.
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 25, 2019, 10:51 a.m.
Ruslan Polupan

Изменил функциютеперь работает. bool ModelTerminals::setData(const QModelIndex &index, const QVariant &value, int role){ Q_UNUSED(role) if(!index.isValid()) {return false;...
April 24, 2019, 6:20 a.m.
Ruslan Polupan

я так понимаю надо инфорация об устройствах.Я бы пробовал так rust@suse:~> lsblk -PNAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""NAME="sda1" MAJ:MIN="8...
April 21, 2019, 4:16 p.m.
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Join us in social networks

For registered users on the site there is a minimum amount of advertising