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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Как завершить поток, если в нём QEventLoop.exec()?  (Прочитано 7675 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Февраль 23, 2010, 17:14 »

Собсна:
Код
Java
public void run()
{
  this.loop = new QEventLoop();
  this.loop.exec(QEventLoop.ProcessEventsFlag.X11ExcludeTimers);
}
 
В дебаггере run() постоянно "активен".
this.loop.exit(); - не помогает (вообще не пойму какой смысл от этого метода). Как ещё можно завершить поток, если до того кода, который стоит после exec() дело вообще не доходит?
« Последнее редактирование: Февраль 23, 2010, 18:15 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
SABROG
Гость
« Ответ #1 : Февраль 23, 2010, 17:25 »

this.loop.exit(); - не помогает (вообще не пойму какой смысл от этого метода). Как ещё можно завершить поток, если до того кода, который стоит после exec() дело вообще не доходит?

QEventLoop::exit()/QEventLoop::quit() надо вызывать не после QEventLoop::exec(), а внутри слота как реакцию на какой-нибудь сигнал, предположим на нажатие кнопки в GUI'шном потоке. Или сигнал timeout() от таймера.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Февраль 23, 2010, 17:38 »

Как раз так уже попробовал, но
Код
Java
//в главном классе (основной поток):
this.signalStop.connect(this.thread, "thStop()");
 
//класс, который содержит run() и QEventLoop в нём:
public QEventLoop loop;
 
public void run()
{
 this.loop = new QEventLoop();
 this.loop.exec(QEventLoop.ProcessEventsFlag.X11ExcludeTimers);
}
 
public void thStop()
{
this.loop.exit();
}
 
Испускаю сигнал в главном потоке this.signalStop.emit(); после чего ошибка о разных потоках. Как в этом случае одолеть? Ведь если QEventLoop создать в run()'e, к нему нельзя будет обратиться для завершения((

Притом пример из доки:
Код
Java
class EventLoopThread implements Runnable
   {
       @Iverride
       public void run()
       {
           QEventLoop loop = new QEventLoop();
           loop.exec();
 
           // Do whatever
 
           loop.exit();
       }
   }
 
Ерунда какая-то.
« Последнее редактирование: Февраль 23, 2010, 17:49 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #3 : Февраль 23, 2010, 18:05 »

Испускаю сигнал в главном потоке this.signalStop.emit(); после чего ошибка о разных потоках. Как в этом случае одолеть? Ведь если QEventLoop создать в run()'e, к нему нельзя будет обратиться для завершения((
Тип connect'а должен быть Qt::QueuedConnection. Правда я не знаю как это на Jambi делается.

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )   [static]
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Февраль 23, 2010, 18:05 »

поставил слот как
Код
Java
this.signalStop.connect(this.thread.loop, "quit()");
 
заработало, всем спасибо за внимание и советы
« Последнее редактирование: Февраль 23, 2010, 18:17 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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