Search code examples
c++qtqthread

Is this the correct way to use a QThread?


I am looking at some github projects, where one of them did the UDPlink in the following way, first it subclass QThread to create a class UDPLink:public QThread and its constructor and deconstructor is like:

UDPLink::UDPLink(UDPConfiguration* config)
    : _socket(NULL)
    , _connectState(false)
{
    Q_ASSERT(config != NULL);
    _config = config;
    _config->setLink(this);

    // We're doing it wrong - because the Qt folks got the API wrong:
    // http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
    moveToThread(this);

    // Set unique ID and add link to the list of links
    _id = getNextLinkId();
    qDebug() << "UDP Created " << _config->name();
}

UDPLink::~UDPLink()
{
    // Disconnect link from configuration
    _config->setLink(NULL);
    _disconnect();
    // Tell the thread to exit
    quit();
    // Wait for it to exit
    wait();
    this->deleteLater();
}

Though the code did compile and work, but I wonder whether this way of using a QThread would be correct?


Solution

  • As Qt developer recommended, Code you mentioned is not correct way to use QThread.

    Recommended way is suggested here.

    Sample code from Post.

    Producer producer;
    Consumer consumer;
    producer.connect(&consumer, SIGNAL(consumed()), SLOT(produce()));
    consumer.connect(&producer, SIGNAL(produced(QByteArray *)), SLOT(consume(QByteArray *)));
    
    // they both get their own thread
    QThread producerThread;
    producer.moveToThread(&producerThread);
    QThread consumerThread;
    consumer.moveToThread(&consumerThread);
    
    // go!
    producerThread.start();
    consumerThread.start();