Russian Qt Forum

Qt => Общие вопросы => Тема начата: megido от Декабрь 12, 2016, 10:01



Название: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 10:01
как выполнять действия в слотах если они тормозят гуи?



Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 10:07
Выполнять действия в потоке. Ты написал немного бред, конкретизируй задачу, опиши архитектуру.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 10:13
Выполнять действия в потоке. Ты написал немного бред, конкретизируй задачу, опиши архитектуру.
ну например вот слот


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

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



Название: Re: операции в слотах тормозят GUI
Отправлено: gil9red от Декабрь 12, 2016, 10:27
У вас слишком абстрактный пример, нужно больше вашего кода
Если у вас из потока происходит постоянный без задержек (хотя бы в 1 мс) отправление сигналов в гуи, он может подвиснуть


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 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);

}


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 10:39
Я так понимаю, слот, который законнекчем на сигнал UpdateSettingsParamSignal долго отрабатывает и находится в этом же потоке? Понятно, что тупить будет. Эмить сигнал не на движение слайдера, а на отпускание его. Или расчеты выноси в отдельный поток.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 10:46
Я так понимаю, слот, который законнекчем на сигнал UpdateSettingsParamSignal долго отрабатывает и находится в этом же потоке? Понятно, что тупить будет. Эмить сигнал не на движение слайдера, а на отпускание его. Или расчеты выноси в отдельный поток.
да не, там вообще пока ничего не происходит, так заглушка.
вариант с отпусканием мне не нравится


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 10:53
Приложи сюда минимальный компилябельный пример с "тормозящим" поведением, а мы тебе расскажем, как надо, а как не надо делать.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 11:05
так все приехали. не работает вариант с тредом. после может сотни вызовов потоки больше не хотят создаватся.


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 11:11
Нельзя много потоков создавать. Приложи сюда пример, я уверен, что ты совершенно неправильно работаешь с потоками.


Название: Re: операции в слотах тормозят GUI
Отправлено: Igors от Декабрь 12, 2016, 11:24
Эмить сигнал не на движение слайдера, а на отпускание его. Или расчеты выноси в отдельный поток.
Ну все не так уж просто. В первом случае перемещение слайдера не имеет эффекта до отпускания мыши - это может не устроить. Во втором нужно предусмотреть "заваливание" сигналами которые не успевают обрабатываться.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 11:25
Нельзя много потоков создавать. Приложи сюда пример, я уверен, что ты совершенно неправильно работаешь с потоками.

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

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

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

}

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

я тут создал тестовую прогу, походу это не имеет смысла  :-[


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 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, а по его сигналу о завершении берешь данные, которые он произвел. Надеюсь, что-то ты поймешь из того, что я написал.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 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());
}



Название: Re: операции в слотах тормозят GUI
Отправлено: gil9red от Декабрь 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());
}


А в чем, собственно, ваша задача? :)


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 11:35
Так делать не нужно. Можно примерно так:

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


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 11:38
Передавай их в invokeMethod.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 11:39
Передавай их в invokeMethod.
что это у тебя за qt такой?
не пойму как разделить это все и поместить в header

и что такое public Q_SLOTS?


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 11:42
Уууууу. Читай доки по Кьюту. public slots тебе понятнее?


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 11:45
Уууууу. Читай доки по Кьюту. public slots тебе понятнее?
я в доках такого не видал. у тебя какой куте то?


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 11:51
Любой, начиная с версии 4.0.0


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 11:52
http://doc.qt.io/qt-4.8/qobject.html#Q_SLOTS


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 12:10

так а доступ к  переменным и функциям главного класса в этом объекте не получить? опять городить 55 слотов чтоли? =_=


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 12:20
Мне кажется, у тебя архитектурные проблемы. У тебя 55 членов класса?


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 12:31
Мне кажется, у тебя архитектурные проблемы. У тебя 55 членов класса?
ну не 55 конечно, но хватает.


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 12:38
Без конкретных примеров ничего сказать не могу. Могу только посоветовать почитать литературу по проектированию. Допустим, Боба Мартина. Данные можно сгруппировать в структуры. Желательно разбить на классы, а не валить все в MainWindow. Прочитай про SOLID. В общем, подтяни свои знания по ООП.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 13:18
Без конкретных примеров ничего сказать не могу. Могу только посоветовать почитать литературу по проектированию. Допустим, Боба Мартина. Данные можно сгруппировать в структуры. Желательно разбить на классы, а не валить все в MainWindow. Прочитай про SOLID. В общем, подтяни свои знания по ООП.
ну например у меня поток, в нем выполняется какое то действие после которого нужно что-то поменять в UI, в потоке ui недоступно ну и начинается:

void Class::SlotForSetTitle(QString val){/* ... */}
void Class::SlotForChangeStatus(QString val){/* ... */}
void Class::SlotForCheckButtonPlay(QString val){/* ... */}
void Class::SlotForCheckButtonStop(QString val){/* ... */}
void Class::SlotForClearSomething(QString val){/* ... */}

ну и так далее...


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 13:38
Жесть. Пусть воркер возвращает структуру с данными, а в слоте данные достанешь и на основе их настроишь гуй.


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 13:41
Жесть. Пусть воркер возвращает структуру с данными, а в слоте данные достанешь и на основе их настроишь гуй.
ну я бы так сделал если бы все было в одном месте. а так там кусок, тут кусок...


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 12, 2016, 14:39
а в воркере будут доступны переменные из главного класса, ну в каком я его запустил?

да, передай указатель и защити мутексом


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 14:44
а в воркере будут доступны переменные из главного класса, ну в каком я его запустил?

да, передай указатель и защити мутексом

Вот не надо херню советовать.


Название: Re: операции в слотах тормозят GUI
Отправлено: Igors от Декабрь 12, 2016, 14:51
Вообще "вынос в поток" - мода довольно молодая. Раньше как-то спокойно обходились вторичным циклом - и все работало в одной нитке


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 14:55
Вообще "вынос в поток" - мода довольно молодая. Раньше как-то спокойно обходились вторичным циклом - и все работало в одной нитке
Ты имеешь ввиду processEvents?


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 12, 2016, 16:44
а в воркере будут доступны переменные из главного класса, ну в каком я его запустил?

да, передай указатель и защити мутексом

Вот не надо херню советовать.

мутекс не нужен считаешь ?


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 18:50
Я считаю что не надо шарить указатели между классами, а тем более потоками.


Название: Re: операции в слотах тормозят GUI
Отправлено: kuzulis от Декабрь 12, 2016, 19:35
QtConcurrent::Run еще не советовали?  ::)


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 12, 2016, 20:49
Я считаю что не надо шарить указатели между классами, а тем более потоками.

указатель на класс это плохо ?
http://doc.qt.io/qt-5/qsharedpointer.html тоже ненужен ?
а мутексы для того и нужны, чтобы иметь доступ к памяти из разных потоков


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 21:15
qate, если можно обойтись без мютекса, то лучше это сделать. Давай попробую тебе объяснить аллегорически. Представь, что переменная - это женщина. Если женщиной владеет один мужчина, то это отлично. Если два, то могут быть конфликты (которые потом могут проходить по УК РФ). Но если мужчин становится слишком много, можно чего-нибудь подхватить не того. Тебе оно надо?


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 12, 2016, 21:54
Давай попробую тебе объяснить аллегорически.

Боже мой, какие фантазии!

Расскажи - как обойтись без мутексов при доступе к общим данным из 2+ потоков ?



Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 12, 2016, 22:08
Давай попробую тебе объяснить аллегорически.

Боже мой, какие фантазии!

Расскажи - как обойтись без мутексов при доступе к общим данным из 2+ потоков ?



Закрой глаза и я тебе расскажу. Только тсссссс. Закрыл? Не подглядывай! Легко обойтись без мютексов если.... НЕ ОБРАЩАТЬСЯ К ОБЩИМ ДАННЫМ ИЗ 2+ ПОТОКОВ!!! Эврика, мать его.


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 12, 2016, 22:51
НЕ ОБРАЩАТЬСЯ К ОБЩИМ ДАННЫМ ИЗ 2+ ПОТОКОВ!!! Эврика, мать его.

ты вообще понимаешь глупость своего утверждения ?

общие данные на то и "общие", что к ним идет обращение их 2+ потоков, иначе они частные


Название: Re: операции в слотах тормозят GUI
Отправлено: megido от Декабрь 12, 2016, 23:40
у меня что-то стала зависать отрисовка гуи. через короткое время после запуска гуи перестает отрисовыватся.
программа работает,ничего не висит, я даже могу двигать слайдер(каторый не перемещается).
ошибок не выдает, если перезапустить процесс или нажать на какую нибудь кнопку  все станет нормально, но через секунд 5 опять перестанет отрисовывать.
данные для отрисовки идут,вижу в логах
 куда копать?
а я кажется понял, походу нельзя рисовать гуи в потоке, опять сигналы со слотами городить(((


Название: Re: операции в слотах тормозят GUI
Отправлено: Racheengel от Декабрь 13, 2016, 00:17
Зачем воркеру мутекс? Воркер при инициализации получит данные, настроит свои локальные переменные (это все в "главном" потоке еще), а потом start() и пошло поехало.

А вообще, по теме - непонятно, какая цель у автора? Какие-то слоты, треды, гуй теперь еще образовался...
Сделать то что надо?


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 13, 2016, 08:28
ты вообще понимаешь глупость своего утверждения ?

общие данные на то и "общие", что к ним идет обращение их 2+ потоков, иначе они частные

Чувак, ты походу не понял мой пример. С одной женщиной должен быть только один мужчина. Тогда никаких проблем не будет. Если мужчин становится несколько, приходится предохраняться (но ощущения уже не те, да и защита не 100%), да еще и разбираться потом чьи дети и кто за них отвечает.
Я не говорю, что таких ситуаций стоит вообще сторониться (есть же проститутки и это нормально, наверное), но не стоит возводить это в привычку.


Название: Re: операции в слотах тормозят GUI
Отправлено: kuzulis от Декабрь 13, 2016, 08:35
Цитировать
С одной женщиной должен быть только один мужчина.

А если женщины делят одного мужика - то это как? Мутексы нужны?  ;)


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 13, 2016, 08:42
Цитировать
С одной женщиной должен быть только один мужчина.

А если женщины делят одного мужика - то это как? Мутексы нужны?  ;)
Доктор, откуда у вас такие пошлые картинки?


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 13, 2016, 12:28
Я не говорю, что таких ситуаций стоит вообще сторониться (есть же проститутки и это нормально, наверное), но не стоит возводить это в привычку.

С чего ты решил что доступ к общим данным это зло ?
Это нормальная практика при межпоточной работе
Если при этом затрагиваются твои личные половые проблемы, которые ты тут красочно описываешь, то не вводи ими остальных в заблуждение


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 13, 2016, 12:46
> С чего ты решил что доступ к общим данным это зло?
Нарушение инкапсуляции. Непонятно кто отвечает за время жизни. Возможность выстрелить себе в ногу.

> Это нормальная практика при межпоточной работе
Ты уверен? Кьют наоборот подталкивает к избавлению от общих данных в пользу сигнально/слотового общения.


Название: Re: операции в слотах тормозят GUI
Отправлено: Авварон от Декабрь 13, 2016, 13:04

С чего ты решил что доступ к общим данным это зло ?
Это нормальная практика при межпоточной работе

Ну в общем-то достаточно одного общего места - очереди сообщений. Эта очередь прозрачно реализует всевозможные (почти*) юзкейзы всех остальных очередей.

*Кроме блокирующего инвока, но он реализуется, собственно, сигнал-слотами поверх этой очереди.


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 13, 2016, 13:27
> С чего ты решил что доступ к общим данным это зло?
Нарушение инкапсуляции. Непонятно кто отвечает за время жизни. Возможность выстрелить себе в ногу.

QSharedPointer QPointer спасают

> Это нормальная практика при межпоточной работе
Ты уверен? Кьют наоборот подталкивает к избавлению от общих данных в пользу сигнально/слотового общения.


пусть есть класс с разными свойствами, из потоков их надо читать в разное время разные
способ 1 - отдать в потоки указатель
способ 2 - сигналы\слоты - как ?


Название: Re: операции в слотах тормозят GUI
Отправлено: Пантер от Декабрь 13, 2016, 13:37
Слишком прозрачный пример. :)


Название: Re: операции в слотах тормозят GUI
Отправлено: qate от Декабрь 13, 2016, 14:14
обычный пример - доступ к ресурсу из потоков