В общем задачка такая: есть один поток основной в котором нужно организовать ожидание какого-либо события из другого потока. Вгружаюсь уже неделю по теме QMutex, QWaitCondition и т.д. но так ничего конструктивного не получилось. Натолкните плиззз на мыслю, как это решается в Qt? Ну например задачка выглядит так:
MyThread thr;
void MainWindow::on_pushButton_clicked()
{
this->thr.start(QThread::NormalPriority);
// здесь нужно дождаться пока поток thr выполнит какие-либо свои действия this->thr.exit();
}
void MyThread::run()
{
qDebug()<<"thread begin"<<endl;
this->sleep(3);
qDebug()<<"thread made smth"<<endl;
exec();
}
Re: Всем привет! Помогите плз разобраться с потоками
Можно сделать в MyThread сигнал, который будет испускаться при завершении работы потока, а MainWindow будет иметь слот, связанный с сигналом потока и, соответсвенно, вызовется после завершения работы потока.
Re: Всем привет! Помогите плз разобраться с потоками
А>void MainWindow::on_pushButton_clicked() А>{ this->>thr.start(QThread::NormalPriority);
А> // здесь нужно дождаться пока поток thr выполнит какие-либо свои действия
this->>thr.exit(); А>}
А зачем тут тред, если все равно его ждать? Выполнил бы все прямо в обработчике.
Треды по идее как раз и нужны здесь для того, чтобы обработчик не блокировать.
Ну а так, либо через QWaitCondition, либо сигнал послать.
хотел уже на боковую
папаху снял и сапоги
но в комментариях проснулись
враги
Re: Всем привет! Помогите плз разобраться с потоками
class obj1 : public QObject
{
Q_OBJECT
public Q_SLOTS:
void obj_slot( )
{
qDebug( ) << "catch slot in th1";
}
};
class th1 : public QThread
{
Q_SIGNALS:
void fire_slot( );
protected:
virtual run( )
{
obj1 o;
connect( this, SIGNAL( fire_slot( ) ), &o, SLOT( obj_slot( ) ) );
exec( );
}
};
class th2 : public QThread
{
Q_SIGNALS:
void fire_slot( );
protected:
void run( )
{
qDebug( ) << "fire signal in th2";
Q_EMIT fire_slot( );
}
};
int main( int argc, char ** argv )
{
QCoreApplication a( argc, argv );
th1 t1;
th2 t2;
connect( &t2, SIGNAL( fire_slot( ) ), &t1, SIGNAL( fire_slot( ) ) );
t1.start( );
t2.start( );
// тут надо подождать пока запустятся потоки
a.exec( );
}
Re[2]: Всем привет! Помогите плз разобраться с потоками
От:
Аноним
Дата:
02.08.11 13:54
Оценка:
Здравствуйте, reich, Вы писали:
R>Можно сделать в MyThread сигнал, который будет испускаться при завершении работы потока, а MainWindow будет иметь слот, связанный с сигналом потока и, соответсвенно, вызовется после завершения работы потока.
Спасибо!
Черт, не совсем корректно объяснил что хочу, сорри. Про слот не катит, щас переформулирую...
MyThread thr;
void MainWindow::on_pushButton_clicked()
{
this->thr.start(QThread::NormalPriority);
// все 3 функции лезут в сокет который работает в другом потоке (thr) и пока не придет ответ из сети, следующая функция не должна запускатьсяthis->Func_1();
// здесь нужно дождаться пока из сетки не приплывет ответ на Func_1() this->Func_2();
// здесь нужно дождаться пока из сетки не приплывет ответ на Func_2() this->Func_3();
this->thr.exit();
}
void MyThread::run()
{
// здесь происходит отправка/прием всякого мусора по сети/из сети
//мусор оправил
//долго и мучительно мусор принимал
//теперь надо сообщить в MainWindow что можно приступать к следующей функции, например Func_2()
exec();
}
Re[3]: Всем привет! Помогите плз разобраться с потоками
MyThread thr;
void MainWindow::on_pushButton_clicked()
{
connect( &thr, SIGNAL( finished( ) ), SLOT( Func_1( ) ) );
this->>thr.start(QThread::NormalPriority);
}
public Q_SLOTS:
this->>Func_1()
{
}
}
void MyThread::run()
{
// здесь происходит отправка/прием всякого мусора по сети/из сети
//мусор оправил
//долго и мучительно мусор принимал
}
Re[4]: Всем привет! Помогите плз разобраться с потоками
От:
Аноним
Дата:
02.08.11 14:28
Оценка:
Здравствуйте, sploid, Вы писали:
S>
S>MyThread thr;
S>void MainWindow::on_pushButton_clicked()
S>{
S> connect( &thr, SIGNAL( finished( ) ), SLOT( Func_1( ) ) );
this->>>thr.start(QThread::NormalPriority);
S>}
S>public Q_SLOTS:
this->>>Func_1()
S>{
S>}
S>}
S>void MyThread::run()
S>{
S> // здесь происходит отправка/прием всякого мусора по сети/из сети
S> //мусор оправил
S> //долго и мучительно мусор принимал
S>}
S>
Эмммм... в этом варианте получается что, сигнал завершения потока должен быть прицеплен ко всем слотам типа Func_x, что не очень вроде красиво. В том плане что их нужно жестко прицеплять к нему, то есть завершение обработки в потоке сокета как бы не должно вызывать следующую функцию (ее вообще может и не быть), а должно лишь сообщать что МОЖНО вызывать следующую... Как то так. Хотя может уже башка квадратная и туплю, но необходимо построить механизм именно таким способом
то есть получается что emit finished вызовет незмедлительно Func_x, а надо лишь создать ожидание при котором следующая функция не будет вызвана пока не отработает предыдущая. Как бы механизм в дебильном варианте с блокированием окна такой (осталось придумать не дебильный ):
void MainWindow::on_pushButton_clicked()
{
this->thr.start(QThread::NormalPriority);
// все 3 функции лезут в сокет который работает в другом потоке (thr) и пока не придет ответ из сети, следующая функция не должна запускатьсяthis->thr.b = false;
this->Func_1();
while(!this->thr.b)
{
}
this->Func_2();
this->thr.exit();
}
void MyThread::run()
{
// здесь происходит отправка/прием всякого мусора по сети/из сети
//мусор оправил
//долго и мучительно мусор принималthis.b = true;
exec();
}