QThread: многопоточное программирование в Qt
QThread - это класс в библиотеке Qt, который предназначен для работы с многопоточностью в приложениях, написанных на этом фреймворке. Он позволяет создавать потоки исполнения на основе POSIX-потоков (POSIX Threads, Pthreads) и доступен во всех основных операционных системах, таких как Windows, Linux и macOS.
Для создания потока на основе класса QThread необходимо создать наследника от этого класса, переопределить его метод run(), в котором будет содержаться код, который должен выполняться в отдельном потоке. Например:
c++
#include
#include
class MyThread : public QThread
{
public:
void run() override
{
qDebug() << "Starting thread...";
for(int i = 0; i < 10; i++)
{
qDebug() << "Thread " << QThread::currentThreadId() << ": " << i;
msleep(1000); // Задержка на 1 секунду
}
qDebug() << "Thread finished.";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyThread thread;
thread.start();
return a.exec();
}
В данном примере мы создаем класс MyThread, который наследуется от QThread и имеет переопределенный метод run(). Внутри метода run() мы выводим в консоль сообщения с помощью метода qDebug() и добавляем задержку на 1 секунду между выводами с помощью метода msleep(). В основной функции мы создаем экземпляр класса MyThread и запускаем его методом start().
Также существует возможность передачи параметров в поток исполнения и получения результатов его работы. Для этого необходимо использовать методы, такие как QThread::start(), QThread::wait(), QThread::terminate() и QThread::finished(), а также переопределить методы QThread::run(), QThread::quit() и QThread::run(). Например:
c++
#include
#include
class MyThread : public QThread
{
public:
MyThread(int id) : threadId(id)
{
}
void run() override
{
qDebug() << "Starting thread " << threadId << "...";
for(int i = 0; i < 10; i++)
{
qDebug() << "Thread " << threadId << ": " << i;
msleep(1000); // Задержка на 1 секунду
}
emit finished(threadId);
}
signals:
void finished(int);
private:
int threadId;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int numThreads = 3;
QVector threads(numThreads);
for(int i = 0; i < numThreads; i++)
{
threads[i] = new MyThread(i);
threads[i]->start();
}
for(int i = 0; i < numThreads; i++)
{
threads[i]->wait();
qDebug() << "Thread " << i << " finished.";
delete threads[i];
}
return a.exec();
}
В данном примере создается массив потоков исполнения и запускается их выполнение с помощью метода start(). Затем мы ждем их завершения с помощью метода QThread::wait() и выводим информацию о завершении с помощью метода qDebug(). После этого мы удаляем потоки из памяти с помощью оператора delete.
Таким образом, QThread - это мощный инструмент для работы с многопоточностью в приложениях на Qt. Он позволяет создавать отдельные потоки исполнения, передавать им параметры и получать результаты их работы, а также управлять выполнением потоков с помощью различных методов.