как из потоковой функции можно понять, что ожидается завершение потока ?
Послать ей сигнал.
Или ввести какую-нибудь переменную, например bool m_bThreadStop = false;, которую периодически проверять.
class MyThread : public QThread
{
public:
void run();
};
void MyThread::run()
{
QTcpSocket socket;
// connect QTcpSocket's signals somewhere meaningful
...
socket.connectToHost(hostName, portNumber);
exec();
}
main()
{
QCoreApplication app(...);
MyThread th;
...
app.exec();
...
th.quit();
th.wait();
return 0;
}
while(...)
{
ReadFile(...);
}
Имеется ввиду, что если у вас есть указатели на потоки, то можно вызвать метод QThread::quit(). А проверить есть ли запущенные потоки, кроме основного и подождать их завершения можно так:
if(QThreadPool::globalInstance()->activeThreadCount()) QThreadPool::globalInstance()->waitForDone();
class MyThread : public QThread
{
bool m_bExit;
public:
void run();
};
void MyThread::run()
{
// ...
while( !m_bExit)
{
// ...
ReadFile(...);
}
}
Или выносить в другой поток или не использовать цикл, а пользоваться только сигналами...
А ты попробуй.
Механизм сигналов и слотов асинхронный, если ты не будешь тупо всисеть в sleep в потоке, который должен получить сигнал, то значит всё долно работать.
И еще, как ты думаешь в твоём коде:
main()
{
QCoreApplication app(...);
MyThread th;
...
app.exec();
...
th.quit();
th.wait();
return 0;
}
дойдет выполнение до th.quit(); ?#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();
}
Посмотри на: http://www.doc.crossplatform.ru/qt/4.7.x/qcoreapplication.html#processEvents, он как раз делает то, что тебе нужно...
void Thread::run( void )
{
forever
{
emit send();
QThread::msleep(1000);
}
}
Так всетаки зачем бесконечный цикл то? Мое мнение такое - если бесконечный цикл - то наследоваться от QThread нафиг не нужно - делаем обычный QtConcurrent
processEvents не сбрасывает ничего, а просто дает отработать сигналам для данного потока.
А если цикл не просто бесконечный, с условием, тогда всё в порядке.
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();
}
Чтобы было меньше вопросов, предлагаю тебе почитать вот что:
1. http://www.doc.crossplatform.ru/qt/4.5.0/threads.html
2. http://www.doc.crossplatform.ru/qt/4.5.0/signalsandslots.html
Там не так много букв как кажется, и как показывает практика как хотелось бы, и это базовые знания, которые нужно знать каждому, кто работает с Qt и использует потоки. Ну а без сигналов тут разумеется никуда.
И если после прочтения у тебя возникнут вопросы, то задавай их, но я думаю они сами по себе отпадут.
QtConcurrent, там тоде описан...
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)