QThread – потоки в Qt

Оглавление

  • Процессы и потоки в Qt
  • QProcess – процессы в Qt
  • QThread – потоки в Qt
  • Приоритеты потоков в Qt
  • Обмен сообщениями между потоками
  • Сигнально-слотовые соединения
  • Связь между потоками с помощью высылки событий
  • Синхронизация
  • QMutex — мьютексы в Qt
  • QWaitCondition — условные ожидания в Qt
  • Взаимные блокировки
  • QSemaphore — семафоры в Qt

Потоки становятся все более популярными. Для реализации потоков Qt предоставляет класс QThread. Но давайте сначала разберемся, что же собой представляют потоки.

Поток это независимая задача, которая выполняется внутри процесса и разделяет вместе с ним общее адресное пространство, код и глобальные данные.

Процесс, сам по себе, не является исполнительной частью программы, поэтому для исполнения программного кода он должен иметь хотя бы один поток (далее основной поток). Конечно, можно создавать и более одного потока. Вновь созданные потоки начинают выполняться сразу же, параллельно с главным потоком, при этом их количество может изменяться одни создаются, другие завершаются. Завершение основного потока приводит к завершению процесса, независимо от того, существуют другие потоки или нет.Создание нескольких потоков в процессе получило название многопоточность.

SHEIN Many GEO's

Многопоточность требуется для выполнения действий в фоновом режиме, параллельно с действиями основной программы, и позволяет разбить выполнение задач на параллельные потоки, которые могут быть абсолютно независимы друг от друга. А если приложение выполняется на компьютере с несколькими процессорами, то разделение на потоки может значительно ускорить работу всей программы, так как каждый из процессоров получит отдельный поток для выполнения. К тому же, в последнее время используется все больше компьютеров, оснащенных двухъядерными процессорами (dual core), что делает многопоточное программирование еще более популярным.

Приложения, имеющие один поток, могут выполнять только одну определенную операцию за один промежуток времени, а все остальные операции ждут ее окончания. Например, такие операции, как вывод на печать, считывание большого файла, ожидание ответа на посланный запрос или выполнение сложных математических вычислений, могут привести к блокировке или зависанию всей программы. При помощи многопоточности можно решить такую проблему, запустив подобные операции в отдельно созданных потоках. Тем самым, при зависании одного из потоков, функционирование основной программы не будет нарушено.

Среди разработчиков встречается разное отношение к многопоточному программированию. Некоторые стараются сделать все свои программы многопоточными, а других многопоточность пугает. Важно учитывать и то обстоятельство, что использование потоков существенно усложняет процесс отладки, а также написание самого приложения. Но при правильном и обоснованном применении многопоточности можно существенно улучшить скорость приложения. Неправильное же ее применение, наоборот, может привести к снижению скорости приложения. Поэтому использование потоков должно быть обоснованным. А это значит, что если вы не можете сформулировать причину, по которой следует сделать приложение многопоточным, то лучше отказаться от использования многопоточности. Если вы сомневаетесь, то постарайтесь, на начальных стадиях, создавать два прототипа для тестирования один многопоточный, а другой нет. Тем самым, прежде чем тратить время на разработку программы, можно определить, является ли многопоточность решением поставленной задачи или нет. В том случае, если достижения того же результата можно добиться без использования многопоточности, то стоит отдать предпочтение последнему варианту. Но перед тем как начать написание программы с использованием многопоточности, очень важно разобраться и понять фундаментальные принципы и подходы программирования потоков, применяемые в Qt.

Так с чего же все-таки начинается многопоточное программирование? Оно начинается с наследования класса QThread и переопределении в нем чисто виртуального метода run(), в котором должен быть реализован код, который будет исполняться в потоке. Например:

Второй шаг заключается в создании объекта класса потока и вызове метода start(), который вызовет, в свою очередь, реализованный нами метод run().

Источник:http://qt-doc.ru/qthread-potoki-v-qt.html