Qt/C++ - Lesson 046. QThread - Introduction

Qt, QThread, потоки

GUI thread and the worker thread

Each program has a single thread (thread) on startup. This thread is called the main flow thread or GUI in Qt applications. Qt GUI to be started in this thread. All widgets and several similar classes, such as a QPixmap, do not work in a secondary thread. The secondary flow is commonly called workflow, which is designed to relieve the basis of the program thread.

Concurrent access to data

If two threads are a pointer to an object, it is possible to access both threads to the object at a certain time and this may destroy the integrity of the object. It is necessary to prevent simultaneous access to the object from different threads.

Use cases

There are two main use case flows:

  • Accelerate application due to multiple processors on the computer;
  • Saving GUI responsiveness to the user in the case of long-term processes that can cause a blockage of the application GUI.

When to use alternative threads

Before you create a thread, think maybe there is a possibility to solve the problem of an alternative method.

Alternative Description
QEventLoop::processEvents() Invoke QEventLoop::processEvents() several times when calculating the time costs to prevent blocking GUI. However, this solution does not scale well as the call processEvents() can take place either too often or too infrequently, depending on the computer's hardware platform.
QSocketNotifier QNetworkAccessManager QIODevice::readyRead() This alternative solution has one or several threads, each with blocking read of slow connections. Up until operations for response can be performed quickly, the data structure can be better than using more threads. This design has fewer errors and more energy efficient than flows. In many cases there is also an improvement of productivity.
QTimer Background processes can sometimes be performed using a timer to run on a schedule. For example, it will be carried out with some frequency some code in a special slot of the object. Timer with a value of 0 will be triggered whenever the process is not any other thread of events.

Types of Qt Threads (QTrhread)

The life cycle of the flow Development task Solution
One Invoke Perform one method in another thread in and out of the flow, when the method completes.

Qt provides a variety of solutions:

  • Recording function and run it with QtConcurrent::run()
  • Inheritance from class QRunnable and launch it into the global stream with QThreadPool::globalInstance()->start()
  • Inheritance from class QThread, override method QThread::run() and its use by the method QThread::start().
One Invoke Continuous operation is to be placed in another thread, and the processing result is to be sent to the GUI thread. Use the QThread, overridden run() method is called and an alarm if required. Connecting the signal to the slot using the GUI thread turn signals and slots connections.
One Invoke Operations must be carried out for all objects from the list. Processing to be performed using all available cores. Tippichnym example is the drawing sketches of images in the list. QtConcurrent provides map() method to perform operations on each element, filter() determines the elements of the list, on which the operation will apply.
Permanent There is an object that lives in another thread, and performs a variety of tasks on demand. This means that it takes a certain relationship with the object and required workflow. Inheritance from QObject class and the introduction of the desired signals and slots, object to stream from the event loop running and link to the object through the turn signal/slot.
Permanent There is an object that lives in another thread and perform repetitive tasks. It seems that the timer can approach and the use of signals and slots, but it is better to avoid this approach. For example it can be used QSocketNotifier.
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
n
June 5, 2020, 2:28 a.m.
n1k0m1

Qt - Test 001. Signals and slots

  • Result:0points,
  • Rating points-10
s
June 3, 2020, 1:56 a.m.
silo1995

C++ - Тест 003. Условия и циклы

  • Result:35points,
  • Rating points-10
AP
June 2, 2020, 9:11 p.m.
Aleksej Pikenin

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
Last comments
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
June 5, 2020, 1:27 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Разобрался. У вас изначально в проекте были вот эти настройки: ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableView->setSelectionMode(QAbstractItemVie…
June 4, 2020, 11:10 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Полностью скопировал пример - всё правильно работает. Значит, где-то у меня ошибки в тестовом проекте. Буду разбираться. Извините за беспокойство. :)
Now discuss on the forum
June 5, 2020, 6:13 a.m.
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
MA
June 4, 2020, 2:46 a.m.
Mihail A

Qt- C++ QTableView подсветить строку

Спасибо.
f
June 3, 2020, 1:49 a.m.
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
June 2, 2020, 2:46 a.m.
Evgenij Legotskoj

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
June 2, 2020, 2:01 a.m.
Evgenij Legotskoj

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB