crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Многопоточность в Qt
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
void* Дата 16.6.2008, 14:15
  я особо не читал, но по моему мнению этот класс служит для организации циклов событий, управления ими, т.е. можно вообще например, выключить события и, например, при нажатии на клавишу ничего не будет происходить. Но это лишь мое мнение, точно не знаю
AD Дата 16.6.2008, 11:18
 
Цитата(Litkevich Yuriy @ 16.6.2008, 12:01) *
Ну если всего лишь перевести вступление:
Цитата
The QEventLoop class provides a means of entering and leaving an event loop

то получится:
Цитата
QEventLoop класс предоставляет средства входа и выхода в цикл событий


читая далее:
Цитата
В любое время вы можете создать объект QEventLoop и вызвать exec() для него, чтобы запустить локальный цикл событий.


Я не очень понимаю цели этого цикла событий! Зачем он нужен? Можно объяснить на том, примере, что приведен выше?
Перевод я догадался сделать! ;) :)
Litkevich Yuriy Дата 16.6.2008, 11:01
 
Цитата(AD @ 16.6.2008, 13:59) *
Предназначен обработки в цикле событий или что?

Ну если всего лишь перевести вступление:
Цитата
The QEventLoop class provides a means of entering and leaving an event loop

то получится:
Цитата
QEventLoop класс предоставляет средства входа и выхода в цикл событий


читая далее:
Цитата
В любое время вы можете создать объект QEventLoop и вызвать exec() для него, чтобы запустить локальный цикл событий.
AD Дата 16.6.2008, 9:59
  Есть небольшой вопросик на счет QEventLoop! Прочитал про этот класс в хелпе и не понял его предназначения, можете пояснить своими словами, пожалуйста? Предназначен обработки в цикле событий или что?
alexondi Дата 11.6.2008, 23:03
  Вообщем ситуация с потоками слотами в них такая.
Для того чтобы поток мог отрабатывать сигналы от других потоков (что одно и то же - обработка сигналов и слотов объектов в которых находятся объекты ) НЕОБХОДИМО:
1. в поток добавить QEventLoop - это основной механизм через который идет передача сообщений QEvent's а сигналы реализованы как раз с помощью них
зы можно сделать локальной переменной в методе run а можно и членом класса - на выбор
2. сам поток необходимо поместить сам в себя т.е. сделать в конструкторе this->moveToThread(this);
3. реализовать м методе run что-то вроде этого
void T_SlotThread::run( )
{
   fInnerLoop = new QEventLoop;
   fInnerLoop->exec();
}

ВСЕ!
Теперь все слоты данного потока (а также всех объектов для которых будет вызван метод moveToThread(ref_THREAD) будут выполняться в этом потоке а не в основном.
Сам поток тоже может иметь и сигналы и слоты
sploid Дата 4.6.2008, 14:21
  если я правильно понял вопрос, то должно быть так ( не тестил ):
// свой объект, слоты которого обрабатываются в рабочем потоке
class MyObject : public QObject
{
    Q_OBJECT
public:
    MyObject( ) : m_nValue(10){ };
signals:
    // сигнал о изменении значения.
    void currentValue(int);
    void wantQuit( );
public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);
        if (!m_nValue) {
           emit wantQuit( );
        }
        
    }
private:
    int m_nValue;
};

// ======================================================================
class MyThread : public QThread {
Q_OBJECT

public:
    MyThread()
    {
    }

    void run()
    {
        MyObject myObj( this );
        connect( &myObj, SIGNAL( currentValue( int ) ), SIGNAL( currentValue( int ) ) );
        connect( &myObj, SIGNAL( wantQuit( ) ), SLOT( quit( ) ) );
        QTimer timer;
        connect(&timer, SIGNAL(timeout()), &myObj, SLOT(slotNextValue()));
        timer.start(1000);

        exec();
    }
signals:
    void currentValue(int);
};

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLCDNumber   lcd;
    MyThread     thread;

    QObject::connect(&thread, SIGNAL(currentValue(int)),
                     &lcd,    SLOT(display(int))
                    );
    QObject::connect(&thread, SIGNAL(finished()),
                     &app,    SLOT(quit())
                    );

    lcd.setSegmentStyle(QLCDNumber::Filled);
    lcd.display(10);
    lcd.resize(220, 90);
    lcd.show();
    thread.start();

    return app.exec();
}

#include "main.moc"


а сигнал finished QThread сам генерит при завершении потока.
Litkevich Yuriy Дата 4.6.2008, 9:18
  тут почитай: Связь сигналов и слотов между потоками
ViGOur Дата 4.6.2008, 8:23
  Есть замечательное правило, слот выполняется в том потоке, в котором был создан его объект.
Другими словами тебе нужно, чтобы объект слота slotNextValue создавался в потоке MyThread.
silart Дата 4.6.2008, 8:06
  Добрый день! Подскажите пожалуйста, кто работал с QThread, каким образом сделать так, чтобы сигналы объекта обрабатывались пользовательским потоком, а не потоком графического интерфейса. Вот у Шлее есть 2 примера:

Первый:
#include <QtGui>

// ======================================================================
class MyThread : public QThread {
Q_OBJECT
private:
    int m_nValue;

public:
    MyThread() : m_nValue(10)
    {
    }

    void run()
    {
        QTimer timer;
        connect(&timer, SIGNAL(timeout()), SLOT(slotNextValue()));
        timer.start(1000);

        exec();
    }

signals:
    void finished    (   );
    void currentValue(int);

public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);

        if (!m_nValue) {
            emit finished();
        }
        
    }
};

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLCDNumber   lcd;
    MyThread     thread;

    QObject::connect(&thread, SIGNAL(currentValue(int)),
                     &lcd,    SLOT(display(int))
                    );
    QObject::connect(&thread, SIGNAL(finished()),
                     &app,    SLOT(quit())
                    );

    lcd.setSegmentStyle(QLCDNumber::Filled);
    lcd.display(10);
    lcd.resize(220, 90);
    lcd.show();
    thread.start();

    return app.exec();
}

#include "main.moc"


Второй:

#include <QtGui>

// ======================================================================
class MyThread : public QThread {
Q_OBJECT
private:
    int m_nValue;

public:
    MyThread() : m_nValue(10)
    {
    }

    void run()
    {
        exec();
    }

signals:
    void finished    (   );
    void currentValue(int);

public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);

        if (!m_nValue) {
            emit finished();
        }
        
    }
};

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLCDNumber   lcd;
    MyThread     thread;

    QObject::connect(&thread, SIGNAL(currentValue(int)),
                     &lcd,    SLOT(display(int))
                    );
    QObject::connect(&thread, SIGNAL(finished()),
                     &app,    SLOT(quit())
                    );

    QTimer timer;
    QObject::connect(&timer, SIGNAL(timeout()), &thread, SLOT(slotNextValue()));
//    timer.moveToThread(&thread);
    timer.start(1000);

    lcd.setSegmentStyle(QLCDNumber::Filled);
    lcd.display(10);
    lcd.resize(220, 90);
    lcd.show();
    thread.start();

    return app.exec();
}

#include "main.moc"


Как сделать так, чтобы слот slotNextValue() обрабатывался потоком MyThread? В примерах этот слот обрабатывается главным потоком.
Есть еще функция moveToThread(), но с ней ничего вообще не получается, в слот не попадает ни один поток...
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 16:21