crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> QTimer не срабатывает слот
zloiia
  опции профиля:
сообщение 26.2.2012, 0:00
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 5.5.2011
Пользователь №: 2655

Спасибо сказали: 5 раз(а)




Репутация:   0  


А может пускай таймер постоянно квакает, но в слоте update() смотреть на какой-то внешний флаг активности, который поднимается в object::func() ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 26.2.2012, 13:46
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Ov3r1oad Функция stop() останавливает ваш таймер. Если вы ее вызываете сразу после start() то ваш таймер даже одного раза не успевает отработать.
В функции func() нужно вызвать только start(). А stop() нужно вызвать только после того как ваш таймер выполнит то что ему полагается. В вашем случае это достижение ProgressBar уровня 100%. Значит вам следует либо в функции update() проверять уровень ProgressBar или извне вызвать функцию stop() когда уровень ProgressBar достигнет 100%.
Цитата
Получается, я должен вызвать start и stop в разных функциях?

Да
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ov3r1oad
  опции профиля:
сообщение 27.2.2012, 11:26
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 21.12.2011
Пользователь №: 3085

Спасибо сказали: 0 раз(а)




Репутация:   0  


ilyabvt, Так в функции update() и меняется ProgressBar =), а в этот update, собственно и не заходит вообще программа. Тут видимо надо вызывать поток отдельный для этого таймера.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 27.2.2012, 12:42
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Ov3r1oad Конечно не заходит, ведь вы его остановили. Уберите функцию stop() из func() и поместите ее в update().
Цитата
Тут видимо надо вызывать поток отдельный для этого таймера.

Не надо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 27.2.2012, 12:44
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Ov3r1oad,
смотрите код
class object: public QDialog
{
    Q_OBJECT

    QTimer* timer;
    QPushButton* button_timer_start;
    QPushButton* button_timer_stop;
    
private slots:
    void slot_obj_update();
    void slot_timer_start();
    void slot_timer_stop();
};

object::object ()
{
    timer = new QTimer(this);
    button_timer_start = new QPushButton(this);
    button_timer_stop = new QPushButton(this);
    
    connect(timer, SIGNAL(timeout()), this, SLOT(slot_obj_update()));
    
    connect(button_timer_start, SIGNAL(clicked()),
            this, SLOT(slot_timer_start()));
    
    connect(button_timer_stop, SIGNAL(clicked()),
            this, SLOT(slot_timer_stop()));
}

void object::slot_timer_start()
{
    timer->start(100);
}

void object::slot_timer_stop()
{
    timer->stop();
}

void object::slot_obj_update()
{
    //при очередном шаге (срабатывании) таймера попадаете сюда,
    //выполняете здесь свои вычисления для этого очередного шага:
    //...

    //соответственно этому шагу меняете уровень ProgressBar:
    //...
}
если не хотите делать две кнопки, то смотрите код
class object: public QDialog
{
    Q_OBJECT

    QTimer* timer;
    QPushButton* button_timer_start;
    
private slots:
    void slot_obj_update();
    void slot_timer_start();
};

object::object ()
{
    timer = new QTimer(this);
    button_timer_start = new QPushButton(this);
    
    connect(timer, SIGNAL(timeout()), this, SLOT(slot_obj_update()));
    
    connect(button_timer_start, SIGNAL(clicked()),
            this, SLOT(slot_timer_start()));  
}

void object::slot_timer_start()
{
    timer->start(100);
}

void object::slot_obj_update()
{
    //при очередном шаге (срабатывании) таймера попадаете сюда,
    //выполняете здесь свои вычисления для этого очередного шага:
    //...

    //соответственно этому шагу меняете уровень ProgressBar:
    //...

    if (решили, что пора выключить таймер)
        timer->stop();
}
Не путайте QTimer и оператор цикла for !
Присоединяюсь к словам "Расскажи задачу" (конкретнее, про "затратный по времени код") (прежде чем думать о потоках) :)
P.S. А сообщения запрещено Вам пока редактировать как новичку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ov3r1oad
  опции профиля:
сообщение 27.2.2012, 16:08
Сообщение #16


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 21.12.2011
Пользователь №: 3085

Спасибо сказали: 0 раз(а)




Репутация:   0  


Steklova Olga, ilyabvt, В общем, есть вот большой класс, наследуемый от QDialog. В нём куча кнопок, виджетов и прочей требухи. Так же там есть функция, ну допустим, сжатия файлов. Она, эта функция, затратная по времени, и мне нужно, чтобы пользователь понимал, что вот идёт архивация, и приложение не зависло (как ему может показаться). Для этого я хочу, чтобы на ProgressBar шкала просто двигалась назад и вперед, пока идёт архивация. То он нажимает на кнопку "Архивация", в слоте для этой кнопки лежит вот эта функция архивации. Что мне нужно сделать, чтобы прогрессбар у меня обновлялся?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.2.2012, 16:48
Сообщение #17


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Ov3r1oad, тебе нужно запустить процесс сжатия в отдельном потоке, тогда диалог не перестанет реагировать на сообщения от системы

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 27.2.2012, 18:36
Сообщение #18


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.2.2012, 19:47
Сообщение #19


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Steklova Olga, это не дельфийское, это виндоапишное ) В таких случаях городится костыль - локальная петля обработки сообщений. Но костыль - он и есть костыль , лучше через поток ИМХО. В Qt я не заморачивался поиском такого подпинывателя, а сейчас глянул - нашёл только для перерисовки, для остальных сообщений не нашёл

И - если сделать по-виндошному, то не будет кроссплатформенности

Сообщение отредактировал Алексей1153 - 27.2.2012, 19:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 27.2.2012, 20:52
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Steklova Olga @ 27.2.2012, 19:36) *
Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ?

Ну если я правильно понимаю, что делает Application.ProcessMessages в делфи, то в Qt есть несколько штатных средств для обработки скопившихся сообщений в очереди:
QCoreApplication::processEvents(...)
и
QEventLoop::processEvents(...)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2020, 1:45