Russian Qt Forum
Ноябрь 23, 2024, 08:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: операции в слотах тормозят GUI  (Прочитано 24631 раз)
megido
Гость
« : Декабрь 12, 2016, 10:01 »

как выполнять действия в слотах если они тормозят гуи?

« Последнее редактирование: Декабрь 12, 2016, 10:08 от megido » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 12, 2016, 10:07 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
megido
Гость
« Ответ #2 : Декабрь 12, 2016, 10:13 »

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


Код:
void Prog::MySLot(int val)
{
   emit OtherSignal(val);
   //do something
}
я его запихал в тред стало еще хуже

так я запустил поток, соединил его сигналом started() с нужным слотом. Так вроди нормально, но в слоте  эмитится еще один слот и этот эмит в потоке продолжает тормозить гуи.
 мне что его тоже в поток оборачивать? О.о

« Последнее редактирование: Декабрь 12, 2016, 10:32 от megido » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Декабрь 12, 2016, 10:27 »

У вас слишком абстрактный пример, нужно больше вашего кода
Если у вас из потока происходит постоянный без задержек (хотя бы в 1 мс) отправление сигналов в гуи, он может подвиснуть
Записан

megido
Гость
« Ответ #4 : Декабрь 12, 2016, 10:34 »

У вас слишком абстрактный пример, нужно больше вашего кода
Если у вас из потока происходит постоянный без задержек (хотя бы в 1 мс) отправление сигналов в гуи, он может подвиснуть
я слайдер двигаю мышкой, чем быстрее двигаю  тем больше тупит

вот конкретный код слота

Код:
void Player::SetVolume2()
{
    int volume = volume_int;
    if(volume>0)
    {
        Muted=false;
    }
    emit UpdateSettingsParamSignal(QString("volumelevel"),QString().setNum(volume));

    ui->muteButton->setChecked(false);
    ui->VolumeSlider->setValue(volume);
    float vol=(float)((float)volume/(float)100);
    BASS_ChannelSetAttribute(chan, BASS_ATTRIB_VOL,vol);

}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Декабрь 12, 2016, 10:39 »

Я так понимаю, слот, который законнекчем на сигнал UpdateSettingsParamSignal долго отрабатывает и находится в этом же потоке? Понятно, что тупить будет. Эмить сигнал не на движение слайдера, а на отпускание его. Или расчеты выноси в отдельный поток.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
megido
Гость
« Ответ #6 : Декабрь 12, 2016, 10:46 »

Я так понимаю, слот, который законнекчем на сигнал UpdateSettingsParamSignal долго отрабатывает и находится в этом же потоке? Понятно, что тупить будет. Эмить сигнал не на движение слайдера, а на отпускание его. Или расчеты выноси в отдельный поток.
да не, там вообще пока ничего не происходит, так заглушка.
вариант с отпусканием мне не нравится
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Декабрь 12, 2016, 10:53 »

Приложи сюда минимальный компилябельный пример с "тормозящим" поведением, а мы тебе расскажем, как надо, а как не надо делать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
megido
Гость
« Ответ #8 : Декабрь 12, 2016, 11:05 »

так все приехали. не работает вариант с тредом. после может сотни вызовов потоки больше не хотят создаватся.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Декабрь 12, 2016, 11:11 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 12, 2016, 11:24 »

Эмить сигнал не на движение слайдера, а на отпускание его. Или расчеты выноси в отдельный поток.
Ну все не так уж просто. В первом случае перемещение слайдера не имеет эффекта до отпускания мыши - это может не устроить. Во втором нужно предусмотреть "заваливание" сигналами которые не успевают обрабатываться.
Записан
megido
Гость
« Ответ #11 : Декабрь 12, 2016, 11:25 »

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

ну типа вот так:

по клику на кнопку или изменении слайдера выполняется слот Do

Код:
void MainWindow::Do()
{
    QThread *tdh = new QThread;
    connect(tdh,SIGNAL(started()),this,SLOT(Do2()));
    tdh->start();

}

а вся операция какая должна выполнится в Do2

я тут создал тестовую прогу, походу это не имеет смысла  Обеспокоенный
« Последнее редактирование: Декабрь 12, 2016, 11:31 от megido » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Декабрь 12, 2016, 11:32 »

Так делать не нужно. Можно примерно так:

Код
C++ (Qt)
class Worker : public QObject
{
Q_OBJECT
 
Q_SIGNALS:
 void finished(const QString &result);
 
public Q_SLOTS:
 void do (const QString &in) {
    // some work
   emit finished(result);
 }
};
 
......................
 
MainWindow::MainWindow()
{
 QThread *thread = new QThread;
 worker = new Worker;
 worker->moveToThread(thread);
 thread->start();
}
 
..............
 
QMetaObject::invokeMethod(worker, "do", Q_ARG(QString, in));
 

Это псевдокот. Ты создаешь класс, который будет делать работу, помещаешь его в поток и дергаешь слот через invokeMethod, а по его сигналу о завершении берешь данные, которые он произвел. Надеюсь, что-то ты поймешь из того, что я написал.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
megido
Гость
« Ответ #13 : Декабрь 12, 2016, 11:33 »

вот пример того что надо запихать в поток

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(Do()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Do()
{
    QThread *tdh = new QThread;
    connect(tdh,SIGNAL(started()),this,SLOT(Do2()));
    tdh->start();

}
void MainWindow::Do2()
{
    QThread::sleep(2);
    ui->plainTextEdit->document()->setPlainText(QDateTime::currentDateTime().toString());
}

Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Декабрь 12, 2016, 11:35 »

вот пример того что надо запихать в поток

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(Do()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Do()
{
    QThread *tdh = new QThread;
    connect(tdh,SIGNAL(started()),this,SLOT(Do2()));
    tdh->start();

}
void MainWindow::Do2()
{
    QThread::sleep(2);
    ui->plainTextEdit->document()->setPlainText(QDateTime::currentDateTime().toString());
}


А в чем, собственно, ваша задача? Улыбающийся
Записан

Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 23.