Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
1

Ошибка выполнения программы при использовании нескольких таймеров

15.11.2019, 12:58. Показов 1431. Ответов 12

Author24 — интернет-сервис помощи студентам
Здравствуйте, использую в программе несколько таймеров. Принцип работы следующий: есть несколько lineEdit куда вбиваются целые числа, означающие величину счета в минутах, для каждого таймера свой lineEdit. Далее по нажатию кнопки запускается первый таймер, берет значение из Time1_lineEdit и считает до него. Когда счет заканчивается, то запускается слот второго таймера, который берет значение из Time2_lineEdit и так же считает, а потом запускает слот следующего таймера и так последовательно. Но при выполнении происходит ошибка после того, как досчитал первый таймер и начал счет следующий.

Функция нажатия на кнопку:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void MainWindow::on_Start_Time_segments_Button_clicked()
{
   QString T1 = ui->Time1_lineEdit->text();
   ui->T1_label->setText(T1);
   qDebug() << "QString T1" << T1;
   int T1Int = T1.toInt();
   qDebug() << "Int T1:" << T1Int;
   QTimer::singleShot(T1Int*60000, this, SLOT(slot_T1_Timer()));
   T1_timer->start();
}
Пример реализации слота. Т.е. в первом слоте настраивается и запускается второй таймер, по окончанию счета он вызывает второй слот в котором настраивается и запускается третий таймер и т.д.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void MainWindow::slot_T1_Timer()
{
    qDebug() << "T1_Timer finished";
 
    QString T2 = ui->Time2_lineEdit->text();
    ui->T2_label->setText(T2);
    qDebug() << "QString T2" << T2;
    int T2Int = T2.toInt();
    qDebug() << "Int T2:" << T2Int;
    QTimer::singleShot(T2Int*60000, this, SLOT(slot_T2_Timer()));
    T2_timer->start();
 
//    QString endWorkTime1;
//    endWorkTime1.append(QTime::currentTime().toString());
//    qDebug() << "endWorkTime1:" << endWorkTime1;
}
Прикладываю скрин с ошибкой из отладчика
Миниатюры
Ошибка выполнения программы при использовании нескольких таймеров  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2019, 12:58
Ответы с готовыми решениями:

Ошибка выполнения программы при использовании функций
Все привет, друзья! Имеется задача: Последовательность {Ai}i-1 образована по правилу Ai=1/i. ...

Ошибка выполнения сценария при использовании WebBrowser
Когда в webbrowser обновляю или открываю страницу сайта, появляется окно с ошибкой. Как исправить?

Ошибка времени выполнения при использовании функции scanf_s
Есть код создания библиотеки книг, это его часть. Если потребуется могу скинуть весь код, но он без...

Ошибка автозапуска Nginx с SSL при использовании нескольких IP
День добрый! После добавления сайтов с ssl с привязкой на IP Nginx перестал загружаться при...

12
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,362
15.11.2019, 13:04 2
DmitryDDDD, не видно, где создаётся экземпляр таймера, на который указывает T2_timer

Добавлено через 23 секунды
прицепи проект

Добавлено через 1 минуту
и вообще зачем тут
T1_timer->start();
T2_timer->start();

если синглшот ?

Добавлено через 33 секунды
или это не QTimer-ы ?
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
15.11.2019, 13:15  [ТС] 3
Алексей1153,
Цитата Сообщение от Алексей1153 Посмотреть сообщение
прицепи проект
Там проект уже довольно громозский, я код основных файлов приведу за вычетом функций, не относящихся к этому учатску программы

mainwindow.h
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
//------------------------------------------------------------------
// Includes
 
// Work Time
#include <QWidget>
#include <QTime>
#include <QTimer>
//------------------------------------------------------------------
 
namespace Ui {
class MainWindow;
}
 
//------------------------------------------------------------------
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private slots:
 
    void serialReceived();           // USART
 
    void on_pushButton_2_clicked();
 
    void on_pushButton_3_clicked();
 
    void on_pushButton_4_clicked();
 
    void on_pushButton_5_clicked();
 
    void on_Start_Time_segments_Button_clicked();
 
private:
    Ui::MainWindow *ui;
 
    // Work time
    QTime time;
    QTimer* m_pTimer;
 
    // T1_timer
    QTimer *T1_timer;
    // T2_timer
    QTimer *T2_timer;
    // T3_timer
    QTimer *T3_timer;
    // T4_timer
    QTimer *T4_timer;
    // T5_timer
    QTimer *T5_timer;
    // T6_timer
    QTimer *T6_timer;
    // T7_timer
    QTimer *T7_timer;
    // T8_timer
    QTimer *T8_timer;
 
// Work time
public slots:
    void slot_Timeout();
 
    // T1_timer
    void slot_T1_Timer();
    // T2_timer
    void slot_T2_Timer();
    // T3_timer
    void slot_T3_Timer();
    // T4_timer
    void slot_T4_Timer();
    // T5_timer
    void slot_T5_Timer();
    // T6_timer
    void slot_T6_Timer();
    // T7_timer
    void slot_T7_Timer();
    // T8_timer
    void slot_T8_Timer();
 
};
//------------------------------------------------------------------
 
#endif // MAINWINDOW_H


mainwindow.cpp
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// Work time
#include <QWidget>
#include <QTime>
#include <QTimer>
 
void slot_Timeout();
void slot_T1_Timer();
void slot_T2_Timer();
void slot_T3_Timer();
void slot_T4_Timer();
void slot_T5_Timer();
void slot_T6_Timer();
void slot_T7_Timer();
void slot_T8_Timer();
 
//-----------------------------------------------------------------
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
   // T_timers
   T1_timer = new QTimer;
   T2_timer = new QTimer;   // вот этистрочки я забыл добавить
   T3_timer = new QTimer;
   T4_timer = new QTimer;
   T5_timer = new QTimer;
   T6_timer = new QTimer;
   T7_timer = new QTimer;
   T8_timer = new QTimer;
}
//-----------------------------------------------------------------
 
//-----------------------------------------------------------------
MainWindow::~MainWindow()
{
    delete ui;
}
//-----------------------------------------------------------------
 
void MainWindow::slot_T2_Timer()
{
    qDebug() << "T2_Timer finished";
 
    QString T3 = ui->Time3_lineEdit->text();
    ui->T3_label->setText(T3);
    qDebug() << "QString T3" << T3;
    int T3Int = T3.toInt();
    qDebug() << "Int T3:" << T3Int;
    QTimer::singleShot(T3Int*60000, this, SLOT(slot_T3_Timer()));
    T3_timer->start();
 
    QString endWorkTime2;
    endWorkTime2.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime2:" << endWorkTime2;
}
 
void MainWindow::slot_T3_Timer()
{
    qDebug() << "T3_Timer finished";
 
    QString T4 = ui->Time4_lineEdit->text();
    ui->T4_label->setText(T4);
    qDebug() << "QString T4" << T4;
    int T4Int = T4.toInt();
    qDebug() << "Int T4:" << T4Int;
    QTimer::singleShot(T4Int*60000, this, SLOT(slot_T4_Timer()));
    T4_timer->start();
 
    QString endWorkTime3;
    endWorkTime3.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime3:" << endWorkTime3;
 
}
 
void MainWindow::slot_T4_Timer()
{
    qDebug() << "T4_Timer finished";
 
    QString T5 = ui->Time5_lineEdit->text();
    ui->T5_label->setText(T5);
    qDebug() << "QString T5" << T5;
    int T5Int = T5.toInt();
    qDebug() << "Int T5:" << T5Int;
    QTimer::singleShot(T5Int*60000, this, SLOT(slot_T5_Timer()));
    T5_timer->start();
 
    QString endWorkTime4;
    endWorkTime4.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime4:" << endWorkTime4;
 
}
 
void MainWindow::slot_T5_Timer()
{
    qDebug() << "T5_Timer finished";
 
    QString T6 = ui->Time6_lineEdit->text();
    ui->T6_label->setText(T6);
    qDebug() << "QString T6" << T6;
    int T6Int = T6.toInt();
    qDebug() << "Int T2:" << T6Int;
    QTimer::singleShot(T6Int*60000, this, SLOT(slot_T6_Timer()));
    T2_timer->start();
 
    QString endWorkTime5;
    endWorkTime5.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime5:" << endWorkTime5;
 
}
 
void MainWindow::slot_T6_Timer()
{
    qDebug() << "T6_Timer finished";
 
    QString T7 = ui->Time7_lineEdit->text();
    ui->T7_label->setText(T7);
    qDebug() << "QString T7" << T7;
    int T7Int = T7.toInt();
    qDebug() << "Int T7:" << T7Int;
    QTimer::singleShot(T7Int*60000, this, SLOT(slot_T7_Timer()));
    T7_timer->start();
 
    QString endWorkTime6;
    endWorkTime6.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime6:" << endWorkTime6;
 
}
 
void MainWindow::slot_T7_Timer()
{
    qDebug() << "T7_Timer finished";
 
    QString T8 = ui->Time8_lineEdit->text();
    ui->T8_label->setText(T8);
    qDebug() << "QString T8" << T8;
    int T8Int = T8.toInt();
    qDebug() << "Int T8:" << T8Int;
    QTimer::singleShot(T8Int*60000, this, SLOT(slot_T8_Timer()));
    T8_timer->start();
 
    QString endWorkTime7;
    endWorkTime7.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime7:" << endWorkTime7;
 
}
 
void MainWindow::slot_T8_Timer()
{
    qDebug() << "T8_Timer finished";
 
    QString endWorkTime8;
    endWorkTime8.append(QTime::currentTime().toString());
    qDebug() << "endWorkTime8:" << endWorkTime8;
 
}
 
void MainWindow::on_Start_Time_segments_Button_clicked()
{
   QString T1 = ui->Time1_lineEdit->text();
   ui->T1_label->setText(T1);
   qDebug() << "QString T1" << T1;
   int T1Int = T1.toInt();
   qDebug() << "Int T1:" << T1Int;
   QTimer::singleShot(T1Int*60000, this, SLOT(slot_T1_Timer()));
   T1_timer->start();
}


Вот сейчас заработало, забыл просто объявить все таймеры
T2_timer = new QTimer;
T3_timer = new QTimer;
T4_timer = new QTimer;
T5_timer = new QTimer;
T6_timer = new QTimer;
T7_timer = new QTimer;
T8_timer = new QTimer;
Но код все ранво приведу, может подскажите что тут можно оптимизировать, улучшить)

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
и вообще зачем тут
T1_timer->start();
T2_timer->start();
если синглшот ?
Добавлено через 33 секунды
или это не QTimer-ы ?
QTimer-ы, но почему-то без T1_timer->start(); не запускался таймер, не смотря на то, что сингшот
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,362
15.11.2019, 13:20 4
DmitryDDDD, зачем они тебе вообще тут динамические, объявляй в классе MainWindow сразу объекты

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
private:
    Ui::MainWindow *ui=0;
 
    // Work time
    QTime time;
    QTimer m_Timer;
 
    QTimer T1_timer;
    QTimer T2_timer;
    QTimer T3_timer;
    QTimer T4_timer;
    QTimer T5_timer;
    QTimer T6_timer;
    QTimer T7_timer;
    QTimer T8_timer;
...
Добавлено через 1 минуту
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
QTimer-ы, но почему-то без T1_timer->start(); не запускался таймер, не смотря на то, что сингшот
QTimer::singleShot - статическая функция, ей не нужен объект класса
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
15.11.2019, 13:21  [ТС] 5
Алексей1153, еще сразу вопрос, вот у меня каждый таймер берет значение из соответствующего lineEdit, принимает его за время для отсчета, но еще и записывает в label. А можно как-то сделать так, чтобы в label выводилось, сколько осталось время до конца счета? Была идея прикрутить к каждому таймеру еще по одному таймеру, которые каждую секунду или минуту уменьшали бы изначальное значение счета на 1 и записывали бы в label. Т.е. например задаем мы 5 минут для счета, вот первый таймер считает, а дополнительный таймер к нему обновляет каждую минуту это значение в label и уменьшает на единицу.
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,362
15.11.2019, 13:24 6
вот это всё тоже как-то лишне выглядит
C++
1
2
3
4
5
6
7
8
9
void slot_Timeout();
void slot_T1_Timer();
void slot_T2_Timer();
void slot_T3_Timer();
void slot_T4_Timer();
void slot_T5_Timer();
void slot_T6_Timer();
void slot_T7_Timer();
void slot_T8_Timer();
DmitryDDDD, чтобы отслеживать, сколько времени прошло, для этого как раз объекты таймеров и понадобятся, тогда синглшоты не нужны.

Скопируй и прицепи всё же проект архивом, всё лишнее вырежи. Мне лень накидывать для примера
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
15.11.2019, 13:25  [ТС] 7
Алексей1153,
Цитата Сообщение от Алексей1153 Посмотреть сообщение
зачем они тебе вообще тут динамические, объявляй в классе MainWindow сразу объекты
Так?
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
   QTimer* T1_timer = new QTimer;
   QTimer*T2_timer = new QTimer;
   QTimer*T3_timer = new QTimer;
   QTimer*T4_timer = new QTimer;
   QTimer*T5_timer = new QTimer;
   QTimer*T6_timer = new QTimer;
   QTimer*T7_timer = new QTimer;
   QTimer*T8_timer = new QTimer;
Цитата Сообщение от Алексей1153 Посмотреть сообщение
QTimer::singleShot - статическая функция, ей не нужен объект класса
не совсем понимаю, как это отражается на коде)
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
15.11.2019, 13:36  [ТС] 8
Алексей1153, сделал
Вложения
Тип файла: rar Project.rar (6.1 Кб, 1 просмотров)
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,362
15.11.2019, 14:14 9
DmitryDDDD, я посмотрел, я испугался. Накидал свой пример. В окошках вводятся секунды, кнопка start - запускает каскад таймеров. Справа от едитов считается обратное время.

Всякие косметические тонкости не вычищал, не в них дело.

m_list - список окошек для удобства индексирования
m_timer_for_visual - отвечает за перерисовку циферок справа
m_timer_for_interval - отсчитывает интервалы

m_already_connected - флажок, используемый для того, чтобы более одного раза не коннектить таймер к лямбде. А то срабатывать будет много раз
Вложения
Тип файла: zip timers_prj.zip (2.9 Кб, 2 просмотров)
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,968
15.11.2019, 16:48 10
А зачем много таймеров то? Т.к. в каждый момент времени работает только один - одного и достаточно. Просто брать значение счётчика из разных lineedit, и выводить счётчик на разные label'ы.
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,362
15.11.2019, 17:40 11
alexu_007, вот я ему с одним таймером пример и накидал )
0
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 10
15.11.2019, 18:04 12
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
T2_timer = new QTimer;
T3_timer = new QTimer;
T4_timer = new QTimer;
T5_timer = new QTimer;
T6_timer = new QTimer;
T7_timer = new QTimer;
T8_timer = new QTimer;
Но код все ранво приведу, может подскажите что тут можно оптимизировать, улучшить)
При наличии 11-го стандарта, лучше использовать умные указатели!
В противном случае столкнетесь с утечкой памяти, которую в большом проекте найти будет очень сложно.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
16.11.2019, 17:25  [ТС] 13
Алексей1153,
Цитата Сообщение от Алексей1153 Посмотреть сообщение
я посмотрел, я испугался
Самому страшно), но в целом если оставить только один таймер (действительно, почему-то даже не подумал, что можно использовать один тайме для всех этих операций) вроде все не так и плохо). Но может мой метод довольно топорный, я в процессе изучения как ООП, так и C++. Поэтому разберусь лучше в вашем коде и воспользуюсь им, спасибо за помощь)
0
16.11.2019, 17:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2019, 17:25
Помогаю со студенческими работами здесь

Ошибка при использовании нескольких переменных с одним именем в разных уровнях вложенности циклов for
Почему когда создаешь цикл фор по 2 раза и больше раз,и объявляешь там одну и ту же переменную(с...

При использовании программы metasploit возникла ошибка
При использовании программы возникла ошибка которую вы можете у видеть на скрине ниже помогите...

Ошибка "Непредвиденное появление" при использовании оператора условного выполнения команд
Приветствую. Есть некоторый код, который правильно выполняется, но вот функция :EXIT работает...

Ошибка при выполнения программы
Всех с наступившем НОВЫМ ГОДОМ!!! У меня возникла ошибка при выполнение программы вот код: ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru