Reputation: 77
I use qthread. Because I really don't know how to give a runnable example, I can only briefly describe it. A child thread will be generated when the main thread is running. This child thread will call A (), B (), C () in succession A value will be returned in B (). The main thread needs this value to continue the following calculation. However, it will waste a lot of time to wait for the end of the whole sub thread. I'm not familiar with threads. I hope I can get an answer.
Upvotes: 0
Views: 296
Reputation: 311
You might want to use Qt's Signals & Slots mechanism:
Define a signal in your child thread object. Connect this signal to a slot in your main thread object with Qt::QueuedConnection. At the end of B(), emit the signal with the return value of B() as the signal argument. Slot in the main thread object shall be invoked when the signal emitted by the child thread object is processed by the main thread event loop.
Upvotes: 0
Reputation: 1046
Mmm there is a bunch of ways of doing it... I'll show you one... probably bad one, but it is one way of doing it...
Read comments & ask questions when lost.
class mainWindow : public QWidget {
Q_OBJECT
QLabel *mMyLabel;
Q_SIGNALS:
void sHandleProcessedData(const QString &data);
private Q_SLOTS:
inline void handleProcessedData(const QString &data) {
mMyLabel->setText(data);
/// This should be your Main Thread.
qDebug() << "We are in thread : " << QThread::currentThread() << QThread::currentThread()->objectName();
};
public:
mainWindow() {
/// Take a note of your thread
qDebug() << "We are in thread : " << QThread::currentThread() << QThread::currentThread()->objectName();
/*!
* Simple example gui to show processed data
*/
auto lay = new QGridLayout(this);
mMyLabel = new QLabel("I Will be replaced by worker thread data!");
lay->addWidget(mMyLabel);
auto btn = new QPushButton("Do Processing");
connect(btn, &QPushButton::released, this, &mainWindow::spawnProcess);
lay->addWidget(btn);
/*!
* Lazy thread message hockup using signals
*/
connect(this, &mainWindow::sHandleProcessedData, this, &mainWindow::handleProcessedData, Qt::QueuedConnection); // We want to FORCE queued connection as to not execute this function in worker thread context. We have to be in MAIN thread.
}
inline void spawnProcess() {
/*!
* I'll Use QtConcurrent coz I'm lazy. With Lambda using this as capture.
*/
QtConcurrent::run(this, [this]() {
/// Lots and lots of processing in another thread.
/// Once processing is done, we will send the result via signal to main app.
qDebug() << "We are in thread : " << QThread::currentThread() << QThread::currentThread()->objectName();
Q_EMIT sHandleProcessedData("Some Magical data"); // This will change the Label text to this.
});
}
};
Upvotes: 1