Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
#1

Таймер GUI. Memory leak, растет размер процесса

08.12.2014, 20:17. Просмотров 1122. Ответов 16
Метки нет (Все метки)

Приветствую форумчан!

В кьюте только начинаю разбираться. Написан простой ГУИ таймер.

При закрытии окна (досрочно, если время еще не вышло) процесс остается в памяти и растет в размере кратно своему размеру/сек. Дорастает до~ 2Гб, затем система его kill.

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

Грешу на
1.неопытность
2.Винда 7х64 а компилятор 32 бит.
3.функцию delete (под катом)

Плиз, хэлп!

Использован Qt SDK 4.7.4 | gcc-c++-4.4.0-mingw32 | QtCreator | QtDesigner

Код:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#-------------------------------------------------
#
# Project created by QtCreator 2014-12-01T20:27:19
#
#-------------------------------------------------
 
QT       += core gui
 
TARGET = Timer_v1_2
TEMPLATE = app
 
 
SOURCES += main.cpp\
        mainwindow.cpp
 
HEADERS  += mainwindow.h
 
FORMS    += mainwindow.ui



Кликните здесь для просмотра всего текста

C++
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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QApplication>
#include <QMainWindow>
#include <QTime>
#include <QTimer> // for Delay function
#include <QDebug>
#include <QShortcut> // to assign button (backspace for pause)
#include <QSound> // for sound
 
namespace Ui {
    class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
 
    void on_pushButton_2_clicked();
 
    void on_pushButton_3_clicked();
 
    void on_spinBox_valueChanged(int arg1);
 
    void on_spinBox_2_valueChanged(int arg1);
 
    void on_spinBox_3_valueChanged(int arg1);
 
private:
    Ui::MainWindow *ui;
    QTime time;
    QShortcut *Backspace;
 
    int pauseDurationSec;
    int startHours;
    int startMins;
    int startSecs;    
};
 
// single functions-----------------------------------------------------------------
 
void Delay (int n);
void MyPlaySound (QString s, int n, int d);
 
#endif // MAINWINDOW_H


Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "mainwindow.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
 
    w.setWindowTitle("JustTimer v 1.2");
    w.show();
 
    return a.exec();
}


Кликните здесь для просмотра всего текста

C++
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow), pauseDurationSec (0), startHours (0), startMins(0), startSecs(0)
{
    ui->setupUi(this);
    ui->pushButton_2->setEnabled(false);
    ui->pushButton_3->setEnabled(false);
 
    QRegExp exp("[1-9]{1}[0-9]{0,1}"); //for proper input
 
    Backspace = new QShortcut(QKeySequence("Backspace"), this);
    QObject::connect(Backspace,SIGNAL(activated()),this,SLOT(on_pushButton_3_clicked()));
 
    ui->lineEdit->setValidator(new QRegExpValidator (exp, this));
 
    // ---- start conditions -----
    ui->lineEdit->setText("15");
    ui->checkBox_2->setChecked(true);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_spinBox_valueChanged(int arg1)
{
    ui->pushButton_2->setEnabled(arg1);
    ui->pushButton_3->setEnabled(arg1);
 
    startHours = ui->spinBox->value(); // initialize timer hours value
 
    ui->lcdNumber->display(arg1);
}
 
void MainWindow::on_spinBox_2_valueChanged(int arg1)
{
    ui->pushButton_2->setEnabled(arg1);
    ui->pushButton_3->setEnabled(arg1);
 
    startMins = ui->spinBox_2->value(); // initialize timer mins value
 
    ui->lcdNumber_2->display(arg1);
}
 
void MainWindow::on_spinBox_3_valueChanged(int arg1)
{
    ui->pushButton_2->setEnabled(arg1);
    ui->pushButton_3->setEnabled(arg1);
 
    startSecs = ui->spinBox_3->value(); // initialize timer secs value
 
    ui->lcdNumber_3->display(arg1);
}
 
void MainWindow::on_pushButton_2_clicked() // start button.launches timer
{
    ui->pushButton_2->setStyleSheet("background-color: rgb(0,255,0)");
    ui->pushButton_3->setStyleSheet("background-color: rgb(0,255,0)");   
 
    ui->pushButton_2->setEnabled(false);
 
    ui->spinBox  ->setEnabled(false);
    ui->spinBox_2->setEnabled(false);
    ui->spinBox_3->setEnabled(false);
 
    int startTimeSecs = startHours * 3600 + startMins * 60 + startSecs;
 
    time.start();
 
    while(true)
    {
        int timeElapsed = time.elapsed()/1000;
 
        int counter = pauseDurationSec + startTimeSecs - timeElapsed;
        ui->progressBar->setValue(100 - (startTimeSecs - counter) * 100 / startTimeSecs);
 
        int hrs  = counter / 3600;
        int mins = (counter - hrs * 3600) / 60;
        int secs = counter - hrs * 3600 - mins * 60;
 
        int hrs2  = (startTimeSecs - counter) / 3600;
        int mins2 = (startTimeSecs - counter - hrs2 * 3600) / 60;
        int secs2 = startTimeSecs - counter - hrs2 * 3600 - mins2 * 60;
 
        int minutesPassed = mins2;
        if(mins2 == 59)
            minutesPassed = 60;
 
        bool sound = (minutesPassed % ((ui->lineEdit->text()).toInt()) == 0)? true: false;
        qDebug() << minutesPassed << (ui->lineEdit->text()).toInt() << sound;
 
        if(sound && minutesPassed != 0 && secs2 == 0 && ui->checkBox->isChecked()) // to play sound every N minutes
        {
            MyPlaySound("_periodical_beepWAV.wav", 1, 3000);
        }
 
        ui->lcdNumber  ->display(hrs);
        ui->lcdNumber_2->display(mins);
        ui->lcdNumber_3->display(secs);
        ui->lcdNumber_4->display(hrs2);
        ui->lcdNumber_5->display(mins2);
        ui->lcdNumber_6->display(secs2);
 
        Delay(1000); // for timer proper work (using delay here we able to interact with window and see LCD changes)
 
        if(counter <= 0)
            break;
    }
 
    if(ui->checkBox_2->isChecked())
        MyPlaySound("_periodical_beepWAV.wav", 1, 3000);
 
    if(ui->checkBox_3->isChecked())
        close();
 
    ui->pushButton_2->setStyleSheet("background-color: rgb(255,0,0)");
    ui->pushButton_3->setStyleSheet("background-color: rgb(255,0,0)");
    ui->pushButton_2->setEnabled(false);
    ui->pushButton_3->setEnabled(false);
}
 
void MainWindow::on_pushButton_3_clicked() // pause button. start/stop pause mode
{
    ui->pushButton_2->setStyleSheet("background-color: rgb(255,255,0)");
    ui->pushButton_3->setStyleSheet("background-color: rgb(255,255,0)");
 
    int startPauseSec  = time.elapsed()/1000;
    while(true)
    {
        Delay(100);
        if(ui->pushButton_3->isDown())
        {
            pauseDurationSec += time.elapsed()/1000 - startPauseSec;
            ui->pushButton_3->setDown(false);
            break;
        }
    }
    ui->pushButton_2->setStyleSheet("background-color: rgb(0,255,0)");
    ui->pushButton_3->setStyleSheet("background-color: rgb(0,255,0)");
}
// single functions-----------------------------------------------------------------
 
void Delay (int n) // delay function, mseconds
{
    QEventLoop loop;
    QTimer::singleShot(n, &loop, SLOT(quit()));
    loop.exec();
}
 
void MyPlaySound (QString s, int n, int d) // to play sound
{
    qDebug() << QSound::isAvailable();
    QSound sound (s);
    sound.setLoops(n);
    sound.play();
    Delay(d);
    sound.stop();
}


Добавлено через 15 минут
пардон
3.функцию delete (под катом) 3.функцию Delay () (под катом)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2014, 20:17
Ответы с готовыми решениями:

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер...

Memory Leak in IE 5.0
Утечка памяти до беспамятства системы :) Замечали такое за ИЕ? Может знает кто...

Memory leak
Всем добрый день! Господа знатоки, подскажите пожалуйста, столкнулся со...

Memory leak
Всем добрый день. Помогите пожалуйста разобраться, проверяю приложение в...

Memory leak
Здравствуйте, коллеги. В программе наблюдается утечка памяти. Наблюдается...

16
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
10.12.2014, 10:02  [ТС] #2
Перепроверил код-безуспешно. возможно, где-то не указал предка в конструкторе, но все виджеты создавались в дизайнере и почти все сигнал-слоты- тоже. Приложение выгружается из памяти, если закрыть окно на незапущенном таймере или если таймер заканчивает свою работу сам. Если -же нажать на паузу-то при закрытии окна - утечка
0
Fallenworld
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
11.12.2014, 10:25 #3
C++
1
Backspace = new QShortcut(QKeySequence("Backspace"), this);
- где delete?

C++
1
2
3
 QEventLoop loop;
    QTimer::singleShot(n, &loop, SLOT(quit()));
    loop.exec();
от этого можно 1 строку оставить.
1
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
11.12.2014, 18:09  [ТС] #4
Код C++
1
Backspace = new QShortcut(QKeySequence("Backspace"), this);
- где delete?

Код C++
1
2
3
QEventLoop loop;
QTimer::singleShot(n, &loop, SLOT(quit()));
loop.exec();
от этого можно 1 строку оставить.
Fallenworld, спасибо, ценное замечание. Но вот какая штука- эту фичу с указателем на QShortCut я прописал уже позже, когда утечка уже присутствовала.

И не вполне понял с оптимизацией функции Delay. Прошу извинить возможно глупые вопросы. Это мой первый ГУИ и для первого ГУИ видимо оказался сложноват )) Еще, поскольку виджеты накидывал в дизайнере-удалял там же. возможно, что какие то артефакты остались в moc файле... имеет ли смысл переписать заново код в новый проект?

Добавлено через 8 минут
проблемы несовместимости с разрядностью исключил- запускал на 32битной системе с WinXP- утечка осталась

Добавлено через 2 часа 2 минуты
вот что сообщает компилятор, когда запускаю в кьюте (сам кьют виснет при этом) :

QEventDispatcherWin32::registerTimer: Failed to create a timer (??????? ??????? ??????????? ??? ????????? ?????????? ?? ?????????? ????????? ?????????? ????.)
0
Flassie
184 / 169 / 38
Регистрация: 03.08.2012
Сообщений: 596
Завершенные тесты: 2
11.12.2014, 20:40 #5
Цитата Сообщение от Fallenworld Посмотреть сообщение
- где delete?

Не по теме:

А разве delete нужен для обьектов, которые унаследованы от QObject и которые имеют в родителях тот же QObject?

0
Shtirliz72
201 / 161 / 41
Регистрация: 25.10.2013
Сообщений: 527
11.12.2014, 22:47 #6
Цитата Сообщение от Flassie Посмотреть сообщение
Не по теме:
А разве delete нужен для обьектов, которые унаследованы от QObject и которые имеют в родителях тот же QObject?
Нет. Данные объекты автоматически удалятся при удалении объекта-родителя.

Добавлено через 28 минут
Цитата Сообщение от Shuhart Посмотреть сообщение
Использован Qt SDK 4.7.4 | gcc-c++-4.4.0-mingw32 | QtCreator | QtDesigner
А чего всё старое такое?
0
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
11.12.2014, 23:08  [ТС] #7
хотелось поставить сразу SDK, чтобы во взаимоувязке все компоненты сразу юзать и учиться не отвлекаясь на настройки. Так вот- это самый "свежий" SDK из тех, кот. удалось нарыть, да и то на торрентах. Если знаете, где можно "поновее" найти -буду признателен. У троллтека на сайте удалось скачать только creator и исходники.

Все-же почему то кажется,что проблемы из за статик- метода синглшот QTimer::singleShot(n, &loop, SLOT(quit()));
где то видел на stackoverflow.com упоминание про такие же ругательства компилятора и про то,что вылечилось сие созданием объекта QTimer вместо использ. синглшота. Правда, в моем случае, не представляю как это сделать для функции Delay
0
Shtirliz72
201 / 161 / 41
Регистрация: 25.10.2013
Сообщений: 527
12.12.2014, 09:47 #8
Цитата Сообщение от Shuhart Посмотреть сообщение
хотелось поставить сразу SDK, чтобы во взаимоувязке все компоненты сразу юзать и учиться не отвлекаясь на настройки. Так вот- это самый "свежий" SDK из тех, кот. удалось нарыть, да и то на торрентах. Если знаете, где можно "поновее" найти -буду признателен. У троллтека на сайте удалось скачать только creator и исходники.
Все-же почему то кажется,что проблемы из за статик- метода синглшот QTimer::singleShot(n, &loop, SLOT(quit()));
где то видел на stackoverflow.com упоминание про такие же ругательства компилятора и про то,что вылечилось сие созданием объекта QTimer вместо использ. синглшота. Правда, в моем случае, не представляю как это сделать для функции Delay
Плохо искал. Даже старые SDK есть гораздо новее. Но если не хочешь париться - то добро пожаловать в мир старых багов и подобных проблем.
И вообще - использовать QtCreator на windows в русском дистрибутиве - тот ещё мазохизм. Например они до сих пор не починили jom и он пишет кракозябру. На русской винде или надо использовать MVS c плагинами для QT, или мучаться, пересобирать jom, чтобы понимать что он пишет, и разбираться с дополнительной кучей проблем. С разработкой вообще всё гораздо проще на Linux, только тут уже давным-давно всё автоматизировано, хорошо описано и редко требует от тебя каких-то дополнительных действий.

Далее, насчёт QTimer. Видимо имело с ввиду что-то наподобие:
QTimer timer;
timer.setSingleShot(true).setInterval(int);
timer.connect(SIGNAL(timeout()), &loop, SLOT(quit()));
timer.start();
loop.exec();
timer.disconnect(SIGNAL(timeout()), &loop, SLOT(quit()));
1
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
12.12.2014, 12:27  [ТС] #9
Вы правы- нашел SDK 1.2.1 с либами 4.8+. качаю. не нов конечно, но посвежее. Линукс однозначно в планах,просто стараюсь "разделять и властвовать" . уже близок к уровню просветления "Винда-атавизм"

попробовал Ваш вариант вот таким образом:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
void Delay (int n) // delay function, mseconds
{
    QEventLoop loop;
    //QTimer::singleShot(n, &loop, SLOT(quit())); // old code which seems to cause m.leak
    QTimer timer;
    timer.setSingleShot(true);
    timer.setInterval(n);
    timer.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
    timer.start();
    loop.exec();
    timer.disconnect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
}
при закрытии окна процесс продолжает висеть в памяти и также жрет ресурсы CPU. НО! его размер при этом не растет. уже налицо какая -то положительная динамика и связь
0
Fallenworld
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
12.12.2014, 12:31 #10
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Нет. Данные объекты автоматически удалятся при удалении объекта-родителя.
это ресурсы ими занимаемые удалятся, и это при том, если там счетчик ссылок дойдет до 0. А вот если указатель останется, то не факт.

Добавлено через 2 минуты
Цитата Сообщение от Shuhart Посмотреть сообщение
void Delay (int n) // delay function, mseconds
{
* * QEventLoop loop;
* * //QTimer::singleShot(n, &loop, SLOT(quit())); // old code which seems to cause m.leak
* * QTimer timer;
* * timer.setSingleShot(true);
* * timer.setInterval(n);
* * timer.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
* * timer.start();
* * loop.exec();
* * timer.disconnect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
}
я просто писал так
C++
1
QTimer::singleShot(n, 0, SLOT(quit()));
и все работало
0
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
12.12.2014, 12:34  [ТС] #11
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Нет. Данные объекты автоматически удалятся при удалении объекта-родителя.
это ресурсы ими занимаемые удалятся, и это при том, если там счетчик ссылок дойдет до 0. А вот если указатель останется, то не факт.
удалил указатель в деструкторе. на текущий момент ситуация-как в моем предыдущем посте.
C++ (Qt)
1
2
3
4
5
MainWindow::~MainWindow()
{
    delete Backspace;
    delete ui;    
}
0
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
12.12.2014, 12:49  [ТС] #12
я просто писал так
Код C++
1
QTimer::singleShot(n, 0, SLOT(quit()));
и все работало
код работает, но у меня Delay обрабатывается в цикле и тогда этот код не дает параллельно работать с самим окном (кнопки,галочки)

приатачил код и как выглядит окно для лучшего представления )
0
Миниатюры
Таймер GUI. Memory leak, растет размер процесса  
Вложения
Тип файла: rar Timer_v1_2 - копия.rar (8.0 Кб, 3 просмотров)
Shtirliz72
201 / 161 / 41
Регистрация: 25.10.2013
Сообщений: 527
12.12.2014, 14:55 #13
Цитата Сообщение от Fallenworld Посмотреть сообщение
это ресурсы ими занимаемые удалятся, и это при том, если там счетчик ссылок дойдет до 0. А вот если указатель останется, то не факт.
Какой счётчик ссылок? Этож QObject-parent. Все ресурсы, которые у него числятся в дочерних - удалятся при его уничтожении.
Цитата Сообщение от Fallenworld Посмотреть сообщение
и все работало
Впервые вижу, чтобы в connect в качестве получателя пересылали нулевой адрес. Нигде подобное не видел, даже в документации. Ты уверен что у тебя всё работает, а не тупо вылетает?

P.S. Не поленился - залез в исходники QTimer::singleShot. И как думаешь что же я там увидел?
Код
void QTimer::singleShot(int msec, QObject *receiver, const char *member)
{
    if (receiver && member) {
        ...
    }
}
Поразительно, правда?

Добавлено через 6 минут
Цитата Сообщение от Shuhart Посмотреть сообщение
код работает, но у меня Delay обрабатывается в цикле и тогда этот код не дает параллельно работать с самим окном (кнопки,галочки)
приатачил код и как выглядит окно для лучшего представления )
Не надо там, в QTimer::singleShot(n, 0, SLOT(quit())) писать ноль в качестве получателя. Человек фигню тебе посоветовал.

Попытайся решить методом топора - свяжи connect'ом сигнал выхода из приложения с qApp::quit().
0
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
12.12.2014, 15:34  [ТС] #14
Штирлиц, да, спасибо- я на этом и остановился варианте:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
void Delay (int n) // delay function, mseconds
{
    QEventLoop loop;
    //QTimer::singleShot(n, &loop, SLOT(quit())); // old code which seems to cause m.leak
    QTimer timer;
    timer.setSingleShot(true);
    timer.setInterval(n);
    timer.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
    timer.start();
    loop.exec();
    timer.disconnect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
}
осталось найти, кто(что) не удаляется после закрытия приложения руками/MainWindow::close().

Вот что я еще заметил:
-если я в процессе работы приложения закрываю его "крестиком" от окна- окно закрывается но процесс в памяти забирает весь ресурс CPU (13% при моих 8 ядрах).при этом QDebug работает и пишет в консоль криэйтора но с тормозами и криэйтор жутко тормозит и впоследствии подвисает
-если я в процессе работы приложения закрываю его по close(),
например так
C++ (Qt)
1
2
3
 
if(ui->checkBox_3->isChecked())
            close();
то процесс в памяти так-же "висит" но ресурсы не "жрет" и дебаг сообщения в консоль кьюта идут без тормозов
0
Shtirliz72
201 / 161 / 41
Регистрация: 25.10.2013
Сообщений: 527
12.12.2014, 16:04 #15
Лучший ответ Сообщение было отмечено Shuhart как решение

Решение

Цитата Сообщение от Shuhart Посмотреть сообщение
то процесс в памяти так-же "висит" но ресурсы не "жрет" и дебаг сообщения в консоль кьюта идут без тормозов
Вообще я тебе прямо скажу, бесконечные циклы, особенно для Qt, - это дичайший и в большинстве своём абсолютно ненужный моветон. Попытайся обойтись без них. В Qt всё делается либо по таймеру, либо по событиям. На этом и основана структура сигнал-слот.

P.S. Посоветую тебе ещё один метод топора в виде костыля. Введи булевую переменную в MainWindow и забей её проверку во все свои бесконечные циклы(вместо единицы). Положение true - циклы могут работать, положение false - не могут. И при закрытии ты её обнуляй. Тогда у тебя все бесконечные циклы завершатся и приложение закроется.

Добавлено через 6 минут
P.P.S. А приложение у тебя висит по одной просто причине - потому что другого выхода из своего бесконечно цикла кроме как через if(counter <= 0) break; у тебя нет. А пока оно этот цикл не выполнит - закрыться не сможет. Это про первый цикл. Второй твой цикл с pushButton_3 - вообще караул. Он будет тупо вечен и никогда не сможет завершить. Ибо как только предыдущий цикл выходит - тут же начинается новый.
0
Fallenworld
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
12.12.2014, 17:50 #16
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Человек фигню тебе посоветовал.
да, точно) я то поленился какраз в коде посмотреть,

C++
1
QTimer::singleShot(n, this, SLOT(quit()));
Добавлено через 2 минуты
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Этож QObject-parent.
и это тоже правда, каюсь каюсь

Добавлено через 4 минуты
И да, переопредели timerEvent, запусти таймер, по нажатию кнопки, а дальше переменной конролируй свои значения.
0
Shuhart
3 / 3 / 3
Регистрация: 26.11.2014
Сообщений: 22
12.12.2014, 19:38  [ТС] #17
Вообще я тебе прямо скажу, бесконечные циклы, особенно для Qt, - это дичайший и в большинстве своём абсолютно ненужный моветон. Попытайся обойтись без них. В Qt всё делается либо по таймеру, либо по событиям. На этом и основана структура сигнал-слот.

P.S. Посоветую тебе ещё один метод топора в виде костыля. Введи булевую переменную в MainWindow и забей её проверку во все свои бесконечные циклы(вместо единицы). Положение true - циклы могут работать, положение false - не могут. И при закрытии ты её обнуляй. Тогда у тебя все бесконечные циклы завершатся и приложение закроется.

Добавлено через 6 минут
P.P.S. А приложение у тебя висит по одной просто причине - потому что другого выхода из своего бесконечно цикла кроме как через if(counter <= 0) break; у тебя нет. А пока оно этот цикл не выполнит - закрыться не сможет. Это про первый цикл. Второй твой цикл с pushButton_3 - вообще караул. Он будет тупо вечен и никогда не сможет завершить. Ибо как только предыдущий цикл выходит - тут же начинается новый.
Да, с этими циклами нога прострелена насквозь ). Внутри цикла даже close(); не работает как следует. Т.е. если я находясь внутри цикла по событию (например по галочке) вызываю close()-окно закрывается но процесс не выгружается (даже если я также выхожу при этом из цикла по булевой переменной=false с помощью костылей). этот же close () прекрасно работает за пределами цикла.

Сделал так в общем:
1. добавил кнопку выхода на окно и по ее нажатию выхожу из приложения.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
 while(proceedCycle)
    {
        Delay(100);
.....
}
 
void MainWindow::on_pushButton_clicked()
{
    proceedCycle = false; 
    close();
}
2. красный крестик сделал неактивным. Т.е. выходить легально можно только по кнопке выхода
C++ (Qt)
1
2
3
4
5
6
7
int main(int argc, char *argv[])
{
    .....
 
    w.setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint); // only minimize button is active
.......
}

Криво, косо, но для первого приложения- я пожалуй счастлив результатом


Спасибо большое Shtirliz и Fallenworld за помощь и участие!
0
12.12.2014, 19:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2014, 19:38

Memory leak
Здравствуйте! Люди, очень интересная проблема возникла у моего друга. Программа...

memory leak on WM_PAINT
сразу подробный упрощенный пример. на данной машине использую VC6++. Windows...

Memory leak in the SharedPtr C++98
Стандарт С++98. Задача: реализовать свой SharedPtr (не шаблонный). Всю ночь...


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

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

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