Re: Всем привет! Помогите плз разобраться с потоками
От: Brice Tribbiani Россия http://vzaguskin.github.io
Дата: 02.08.11 13:50
Оценка: +1
Здравствуйте, Аноним, Вы писали:


А>[ccode]

А>MyThread thr;


А>void MainWindow::on_pushButton_clicked()

А>{
this->>thr.start(QThread::NormalPriority);

А> // здесь нужно дождаться пока поток thr выполнит какие-либо свои действия


this->>thr.exit();

А>}

А зачем тут тред, если все равно его ждать? Выполнил бы все прямо в обработчике.
Треды по идее как раз и нужны здесь для того, чтобы обработчик не блокировать.

Ну а так, либо через QWaitCondition, либо сигнал послать.
хотел уже на боковую
папаху снял и сапоги
но в комментариях проснулись
враги
Всем привет! Помогите плз разобраться с потоками
От: Аноним  
Дата: 02.08.11 13:31
Оценка:
В общем задачка такая: есть один поток основной в котором нужно организовать ожидание какого-либо события из другого потока. Вгружаюсь уже неделю по теме 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: Всем привет! Помогите плз разобраться с потоками
От: reich Украина www.reisyd.com
Дата: 02.08.11 13:37
Оценка:
Можно сделать в MyThread сигнал, который будет испускаться при завершении работы потока, а MainWindow будет иметь слот, связанный с сигналом потока и, соответсвенно, вызовется после завершения работы потока.
Re: Всем привет! Помогите плз разобраться с потоками
От: sploid  
Дата: 02.08.11 13:54
Оценка:

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]: Всем привет! Помогите плз разобраться с потоками
От: ro_man  
Дата: 02.08.11 13:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А задействовать тут QStateMachine не вариант?
Re[3]: Всем привет! Помогите плз разобраться с потоками
От: sploid  
Дата: 02.08.11 14:04
Оценка:
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();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.