crossplatform.ru

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


  Ответ в QThread
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
ViGOur Дата 7.10.2011, 9:10
  Чтобы было меньше вопросов, предлагаю тебе почитать вот что:
1. Поддержка потоков в Qt
2. Сигналы и слоты

Там не так много букв как кажется, и как показывает практика как хотелось бы, и это базовые знания, которые нужно знать каждому, кто работает с Qt и использует потоки. Ну а без сигналов тут разумеется никуда.

И если после прочтения у тебя возникнут вопросы, то задавай их, но я думаю они сами по себе отпадут. :)

QtConcurrent, там тоде описан...
gpepsi Дата 7.10.2011, 9:00
  ViGOur, а если я создаю поток только для вычитывания и разбора данных. Далее я хочу разобранные данные отдать в GUI для отрисовки.
Получается, что в run я должен это все делать, а отдавать данные через сигнал. Если объект создан в главном потоке, то и сигнал будет
обработан в главном потоке, что позволит отрисовать их в GUI.
Причем processEvents будет не нужен, т.к. QCoreApplication::exec обрабатывает свой цикл событий.
Причем в данно случае я могу объекту потоку послать сигнал, который будет обработан в главном потоке.

Я правильно размышляю ?

Единственное остался вопрос - зачем тогда вообще создавать объекты в run как в примере
 class MyThread : public QThread
{
public:
     void run();
};

void MyThread::run()
{
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
}

если для GUI их все-равно придется отдавать в главный поток, что за нас делает сигнал

Кстати, если я не использую потоки, а только сигналы, например, вычитывая данные из сокета вся обработка будет в главном потоке, то приведет
к подвисанию GUI если данных очень много

P.S. А чем тогда QtConcurrent полезен ?
ViGOur Дата 7.10.2011, 8:34
 
Цитата
то есть самому контролировать выход ?
Да, именно так. у тебя же цикл не с вечным sleep'ом, вот и вызывай на каждой его итерации processEvents. А он в свою очередь будет обрабатывать сигналы и вызывать что нужно...

Цитата
руками вместо exec ?
Да. Выше уже описал...

Цитата
P.S. и кстати как быть с сигналами. Если объект создан в главном потоке, то и сигналы в главном потоке будут обрабатываться, а если объект создан в run ?
Запомни, в каком потоке создан объек, в том он и обрабатывается. Если тебя это не устраивает, то после создания объекта ты его можешь передать в другой поток с помощью: void QObject::moveToThread ( QThread * targetThread )
gpepsi Дата 7.10.2011, 7:52
 
Цитата(ViGOur @ 6.10.2011, 20:17) *
А если цикл не просто бесконечный, с условием, тогда всё в порядке.

то есть самому контролировать выход ?
Цитата(ViGOur @ 6.10.2011, 20:17) *
processEvents не сбрасывает ничего, а просто дает отработать сигналам для данного потока.

руками вместо exec ?

Цитата(silver47 @ 6.10.2011, 20:12) *
Так всетаки зачем бесконечный цикл то? Мое мнение такое - если бесконечный цикл - то наследоваться от QThread нафиг не нужно - делаем обычный QtConcurrent


а чем он лучше и как решит это мою проблему ?

P.S. и кстати как быть с сигналами. Если объект создан в главном потоке, то и сигналы в главном потоке будут обрабатываться, а если объект создан в run ?
ViGOur Дата 6.10.2011, 19:17
  processEvents не сбрасывает ничего, а просто дает отработать сигналам для данного потока.
А если цикл не просто бесконечный, с условием, тогда всё в порядке.
silver47 Дата 6.10.2011, 19:12
  Так всетаки зачем бесконечный цикл то? Мое мнение такое - если бесконечный цикл - то наследоваться от QThread нафиг не нужно - делаем обычный QtConcurrent
gpepsi Дата 6.10.2011, 18:45
 
Цитата(ViGOur @ 6.10.2011, 18:18) *
Посмотри на: QCoreApplication::processEvents, он как раз делает то, что тебе нужно...


бесконечный цикл он все-равно не сбросит, так что без флага не обойтись :(
silver47 Дата 6.10.2011, 17:40
 
Цитата
void Thread::run( void )
{
    forever
    {
        emit send();
        QThread::msleep(1000);
    }
}


Зачем это? Что Вы делаете в цикле то?
ViGOur Дата 6.10.2011, 17:18
  Посмотри на: QCoreApplication::processEvents, он как раз делает то, что тебе нужно...
gpepsi Дата 6.10.2011, 17:08
 
Цитата(ViGOur @ 6.10.2011, 16:38) *
А ты попробуй.


а что тут пробовать
#include <QThread>

class Thread : public QThread {
    Q_OBJECT
private:
    virtual void run(void);

public :
    explicit Thread(QObject* parent) : QThread(parent) {}
    virtual ~Thread() {}

signals:
    void send(void);
};

class Owner : public QObject {
    Q_OBJECT
private:
    Thread m_thread;

    virtual void timerEvent ( QTimerEvent * event );

public :
    explicit Owner(QObject* parent = nullptr);
    virtual ~Owner() {}
    
public slots:
    void recv(void);
};


код
#include "main.h"
#include <QtCore/QCoreApplication>
#include <QDebug>

void Thread::run( void )
{
    forever
    {
        emit send();
        QThread::msleep(1000);
    }
}

Owner::Owner( QObject* parent /*= nullptr*/ ) : QObject(parent), m_thread(this)
{
    connect(&m_thread, SIGNAL(send()), this, SLOT(recv()));
    m_thread.start();

    startTimer(5000);
}

void Owner::recv( void )
{
    qDebug() << "received signal";
}

void Owner::timerEvent( QTimerEvent * event )
{
    m_thread.quit();
    m_thread.wait();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Owner owner;
    return a.exec();
}


без цикла обработки quit не прокатывает
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 2:32