crossplatform.ru

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

> Многопоточность в Qt, Проблемы с QThread
silart
  опции профиля:
сообщение 4.6.2008, 8:06
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 31.3.2008
Пользователь №: 138

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день! Подскажите пожалуйста, кто работал с 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(), но с ней ничего вообще не получается, в слот не попадает ни один поток...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 4.6.2008, 9:18
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тут почитай: Связь сигналов и слотов между потоками
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.12.2024, 20:51