1 / 1 / 0
Регистрация: 12.10.2013
Сообщений: 11
1

Команда для задержки времени (только не предлагать sleep, с которым нужна многопоточность)

11.02.2015, 19:15. Показов 7724. Ответов 6
Метки нет (Все метки)

Проблема состоит в следующем. Решил немного поиграться в Qt и слепить на скорую руку что-то вроде планировщика задач, который в заданое время давал бы звуковой сигнал и высвечивал задачу. Но застопорился на самом старте - задержка времени.
Еще не зная, сколько у меня уйдет времени и сил на поиски решения (как оказалось, тщетные), я спокойно влепил между задачами всем известный sleep. И вот тут начались веселые приключения.
Кхе-кхе. И вот в чем собсвенно проблема. Опишу кратеньким примером. Припустим есть на форме кнопка. Мы ее жмакаем. Она окрашивается сначала в красный цвет, идет задержка 5 секунд и после этого перекрашивается в зеленый. Сразу на ум приходит следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "unistd.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
    ui->pushButton->setPalette(Qt::red);
    sleep(5);
    ui->pushButton->setPalette(Qt::green);
}
Казалось бы, в чем проблема. Но вот незадача. Вместо описаного алгоритма все работает воввсе не так, как бы хотелось. При нажатии кнопки программа засыпает на 5 секунд а опосле кнопка сразу становится зеленой.
Покопавшись день-второй в инэте, я понял(на 100% не уверен, но предположу), что проблема в потоках. То есть сначала программа оббегает все sleep-ы, а только потом выполняет действия. Происходит это наверное потому, что действие, которое перед sleep, не успевает выполнится до того, как программа уснет.
Решение в нэте всюду одно - делать второй поток. В одном постоянно тикает таймер, во втором выполняются действия. Но вот не задача - с меня программист не ахти, начал недавно с основ. И куда мне сейчас до потоков?
Просить кого-то написать готовый код с потоками хотя бы до этого случая мне стыдно, рука не поднимется скопипастить. Но может есть какие-то функции, которые ждут завершения всех предыдущих вычислений а только потом "усыпляют" программу? Другие варианты пока в голову не пришли.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2015, 19:15
Ответы с готовыми решениями:

Команда задержки Sleep
Здравствуйте. Вот код procedure TForm1.Button1Click(Sender: TObject); begin ...

Sleep() имеет плохую точность задержки времени, есть альтернативы?
Столкнулся с проблемой в коде с++ установка Sleep(1);//Задержка кода на 1 миллисек. Однако это...

Задержки в Sleep
Друзья, есть код #include <iostream> #include<Windows.h> using namespace std; struct...

Какие есть функции для задержки времени?
Привет всем. Кто нибудь знает аналогичные функции time.sleep() в python То есть чтобы какое то...

6
63 / 63 / 47
Регистрация: 08.09.2013
Сообщений: 187
Записей в блоге: 1
11.02.2015, 19:24 2
посмотрите QTimer.
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
11.02.2015, 19:34 3
Лучший ответ Сообщение было отмечено maksas как решение

Решение

Пробуйте как-то так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void MainWindow::on_pushButton_clicked()
{
    ui->pushButton->setPalette(Qt::red);
    QEventLoop loop;
    QTimer timer;
    timer.setInterval(5000); //5 sec
    connect (&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
    timer.start();
    loop.exec();
    ui->pushButton->setPalette(Qt::green);
}
Добавлено через 2 минуты
зы: прошу сильно не бить, т.к. в топике тумэни букв, я только тему и код глянул
1
1 / 1 / 0
Регистрация: 12.10.2013
Сообщений: 11
11.02.2015, 20:16  [ТС] 4
Maxim Prishchepa:
Еще до вашого ответа попробовал использовать QTimer. Вроде что-то получилось. Только не пойму в вашем примере, что такое loop и зачем его использовать. Я как-то без него обошелся.
Но минус таймера в том, что он задает ровные промежутки времени. А у меня интервалы между задачами разные. Разве что создавать по таймеру для каждой задачи.

Добавлено через 21 минуту
Maxim Prishchepa:
loop - это же цикл. Но я не пойму, что он повторяет, тем более в вашем случае. А если он холостой, чисто чтобы сделать задержку, не будет ли он загружать цп?
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
11.02.2015, 20:32 5
Цитата Сообщение от maksas Посмотреть сообщение
loop - это же цикл. Но я не пойму, что он повторяет, тем более в вашем случае. А если он холостой, чисто чтобы сделать задержку, не будет ли он загружать цп?
именно такой вариант не будет, срабатывание таймера условно асинхронное, тот пример который дал я - синхронный, т.е. вы не выйдите из метода на момент задержки, но при этом интерфейс останется отзывчивым для пользователя.

по поводу таймеров, у QObject есть метод startTimer или как-то так... принимает в качестве параметра кол-во секунд, а возвращает идентификатор таймера, срабатывание этого таймера если не ошибаюсь приходит в метод timerEvent(...) в нем будет в качестве параметра идентификатор сработанного таймера, можете на это подвязаться... (при условии, что ваш класс унаследован от QObject)
0
416 / 415 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
11.02.2015, 20:34 6
maksas,
Цитата Сообщение от maksas Посмотреть сообщение
loop - это же цикл. Но я не пойму, что он повторяет, тем более в вашем случае. А если он холостой, чисто чтобы сделать задержку, не будет ли он загружать цп?
вопросы сами собой отпадут если почитать доку...
Цитата Сообщение от maksas Посмотреть сообщение
программа засыпает на 5 секунд
ты хочешь вешать gui ? так не делают, если нужно кнопку перекрасить, то просто делай QTimer::singleShot к слоту который перекрасит кнопку в другой цвет, на время задержки кнопку можно/нужно задизаблить
2
1 / 1 / 0
Регистрация: 12.10.2013
Сообщений: 11
11.02.2015, 20:51  [ТС] 7
Maxim Prishchepa:
Я уже разобрался с этим циклом. За таймеры спасибо, но думаю, этот метод не пригодится в моем случае.
Еще раз благодарю за ответы. Наконец-то разобрался в своем говнокоде

Кудаив:
Доки уже почитал. Синглшот тоже уже нашел сам. Думаю, дальше уже сам разберусь.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2015, 20:51

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

Объясните тупому почему задержка потока по Sleep() больше чем ... с вызывает задержки и других потоков?
Какое отношение они имеют к данному потоку?Ну спит он себе и спит, пусть он выполняется раз в 5...

Нужна команда для разработки ОС
Здравствуйте пользователи CyberForum! Я пишу с другом ОС на С/C++ и Assembler с нуля и нам нужна...

Нужна команда для создания сайтов
Здраствуйте, хочу начать создавать сайты , есть опыт работы с html php javascript jquery. Нужен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.