Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Февраль 23, 2010, 17:14



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


Название: Re: Как завершить поток, если в нём QEventLoop.exec()?
Отправлено: SABROG от Февраль 23, 2010, 17:25
this.loop.exit(); - не помогает (вообще не пойму какой смысл от этого метода). Как ещё можно завершить поток, если до того кода, который стоит после exec() дело вообще не доходит?

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


Название: Re: Как завершить поток, если в нём QEventLoop.exec()?
Отправлено: serg_hd от Февраль 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();
       }
   }
 
Ерунда какая-то.


Название: Re: Как завершить поток, если в нём QEventLoop.exec()?
Отправлено: BRE от Февраль 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]


Название: [решено] Как завершить поток, если в нём QEventLoop.exec()?
Отправлено: serg_hd от Февраль 23, 2010, 18:05
поставил слот как
Код
Java
this.signalStop.connect(this.thread.loop, "quit()");
 
заработало, всем спасибо за внимание и советы