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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: GUI поток и воркер, в котором запущен while(true)-умрут ли слоты?  (Прочитано 16968 раз)
crashtua
Гость
« : Август 24, 2012, 14:52 »

Есть такое дело, гуишный поток запускает дочерний, в методе run которого запущен while(true)... Умрут ли в таком случае сигналы и слоты в воркере? Нужно ли принудительно в том цикле обрабатывать евенты?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Август 24, 2012, 14:54 »

Кто такой воркер?
Записан

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

Умрут ли в таком случае сигналы и слоты в воркере? Нужно ли принудительно в том цикле обрабатывать евенты?
Да. Да.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 24, 2012, 15:07 »

Ну не умрут но к ним нельзя будет достучаться т.к. EventLoop не крутится - то ли Вы его вообще не запустили (нет exec) то ли перебили while (true)
Записан
crashtua
Гость
« Ответ #4 : Август 24, 2012, 15:35 »

Пантер, воркер это Qthread с бесконечным лупом в run.
EventLoop не крутится - то ли Вы его вообще не запустили (нет exec)
Именно, в run нет exec. Если будет exec то тогда не будет моего while(true), который так же необходим, как и EventLoop... А если в ране сделать что то типа
Код
C++ (Qt)
QEventLoop eventLoop;
while(true){
   eventLoop.processEvents();
   //ультранужная задача
}
 
то слоты начнут работать?
Записан
Bepec
Гость
« Ответ #5 : Август 24, 2012, 15:41 »

Помойму кто-то чегой то не понимает. Вроде бы при запуске потока c переопределённым run, EventLoop создаётся. Слоты работать должны.

PS или у меня опять провалы в памяти и пара моих проектов работают чудом?
Записан
crashtua
Гость
« Ответ #6 : Август 24, 2012, 15:46 »

Верес, неа, вот обычный run() из QThread
Код
C++ (Qt)
void QThread::run()
{
   (void) exec();
}
 
А вот и exec()
Код
C++ (Qt)
int QThread::exec()
{
   Q_D(QThread);
   QMutexLocker locker(&d->mutex);
   d->data->quitNow = false;
   if (d->exited) {
       d->exited = false;
       return d->returnCode;
   }
   locker.unlock();
 
   QEventLoop eventLoop;
   int returnCode = eventLoop.exec();
 
   locker.relock();
   d->exited = false;
   d->returnCode = -1;
   return returnCode;
}
 
Тут четко видно, что QEventLoop создается в exec(), так что, как подсказывает логика, свой QEventLoop тоже должен проканать...
Записан
Serr500
Гость
« Ответ #7 : Август 24, 2012, 15:49 »

Помойму кто-то чегой то не понимает. Вроде бы при запуске потока c переопределённым run, EventLoop создаётся. Слоты работать должны.
start() запускает run(), а Event Loop создаётся в exec(). Если до него в run() цикл, то Event Loop'а нет и, соответственно, сигналы не обрабатываются.

А если в ране сделать что то типа
Код
C++ (Qt)
QEventLoop eventLoop;
while(true){
   eventLoop.processEvents();
   //ультранужная задача
}
 
то слоты начнут работать?
Да.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 24, 2012, 15:54 »

Именно, в run нет exec. Если будет exec то тогда не будет моего while(true), который так же необходим, как и EventLoop... А если в ране сделать что то типа
Код
C++ (Qt)
QEventLoop eventLoop;
while(true){
   eventLoop.processEvents();
   //ультранужная задача
}
 
то слоты начнут работать?
Не так, просто QAplication::processEvents, он static. Обычно нет смысла смешивать 2 техники (сигналы и свой while)
Записан
crashtua
Гость
« Ответ #9 : Август 24, 2012, 16:02 »

Не так, просто QAplication::processEvents, он static. Обычно нет смысла смешивать 2 техники (сигналы и свой while)
Дело в том, что в том цикле выполняются операции с сокетами в программе, которая совсем не написана на Qt, и мне просто нужно прикрутить к ней GUI. Если я буду запускать QAplication::processEvents() в том цикле, то всякие разные отрисовки, перерисовки, движения мышки могут достаточно ощутимо затормозить работу с сокетами, собственно, сигналы\слоты нужны только для нескольких функций(запустить обработку, остановить, узнать состояние). Потому то мне кажется, что мой вариант будет обрабатывать только то мизерное количество евентов, которое будет припадать на мой воркер, а не все евенты приложения. Если не прав, то поправляйте:).
Записан
Bepec
Гость
« Ответ #10 : Август 24, 2012, 16:47 »

Вот ненадо мне тут трындить. (это я к тем, которые трындят, что слоты умрут)

Код:
	void run()
{
while (true)
{
Sleep(10);
}
};

Сигнал слоты работают. Так что всё у ТСса работать будет со слотами.

PS помоему такая холиварная тема уже поднималась. И там докопались вроде(давно было ), что start() вызывает exec, если переопределён run().


« Последнее редактирование: Август 24, 2012, 16:51 от Bepec » Записан
andrew.k
Гость
« Ответ #11 : Август 24, 2012, 16:51 »

Пантер, воркер это Qthread с бесконечным лупом в run.
EventLoop не крутится - то ли Вы его вообще не запустили (нет exec)
Именно, в run нет exec. Если будет exec то тогда не будет моего while(true), который так же необходим, как и EventLoop... А если в ране сделать что то типа
Код
C++ (Qt)
QEventLoop eventLoop;
while(true){
   eventLoop.processEvents();
   //ультранужная задача
}
 
то слоты начнут работать?
работать-то начнут, но так же и сожрется проц.
Записан
andrew.k
Гость
« Ответ #12 : Август 24, 2012, 17:17 »

Код:
	void run()
{
while (true)
{
Sleep(10);
}
};

Сигнал слоты работают. Так что всё у ТСса работать будет со слотами.
Смотря какие. В гуи будут работать, а в потоке нет.
Чего холиварного в этой теме?

Вот ненадо мне тут трындить. (это я к тем, которые трындят, что слоты умрут)
...
Сигнал слоты работают. Так что всё у ТСса работать будет со слотами.
А вот и докатились:
Bepec
 Джедай : наставник для всех
 Смеющийся Смеющийся Смеющийся
« Последнее редактирование: Август 24, 2012, 17:25 от andrew.k » Записан
Bepec
Гость
« Ответ #13 : Август 24, 2012, 17:31 »

Код:
class SBFiber : public QThread
{
Q_OBJECT

public:
SBFiber(QObject *parent = 0);
~SBFiber();
void run()
{
connect(this, SIGNAL(sig()), SLOT(slot()));
while (true)
{
emit sig();
Sleep(10);

}
};
public slots:
void slot()
{
qDebug() << "fdsfdf";
};
signals:
void sig();
private:

};

andrew.k сам попробуй. Работают и внешние и внутренние слоты, НЕЗАВИСИМО откуда посылаются/принимаются сигналы.

Я бы себе взял другой титул, но система для всех одна.

PS я в отличие от тебя пробую/получаю результат/отвечаю Подмигивающий А не бросаюсь словами.
Записан
andrew.k
Гость
« Ответ #14 : Август 24, 2012, 17:33 »

PS я в отличие от тебя пробую/получаю результат/отвечаю Подмигивающий А не бросаюсь словами.
не смеши меня!
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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