Потоки по умолчанию Qt

Когда я запускаю новое приложение Qt с минимальным количеством кода и запускаю его, я вижу, что существует несколько потоков, которые, как минимум, равны 2 и могут быть целыми как 5. Обычно он устанавливается на 2, пока я не перетаскиваю окно вокруг, и в это время я вижу до 4 потоков.

Это весь код, который я использую: -

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget mainWindow;
    mainWindow.show();

    return a.exec();
}

Может кто-нибудь объяснить, почему существуют разные темы и для чего они, вероятно, будут? Первоначально я ожидал только одного, но не удивился бы, если бы вторая была использована для обработки сообщений. Однако, что могло бы объяснить другие потоки?

Ответ 1

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

Я попытался запустить вашу программу на Qt 5.1 с помощью инструментария MSVC в Windows. Я настроил отладчик на разрыв создания потоков. Я видел, что было создано 4 дополнительных потока. 3 из них были вызваны Qt, вызывающим RegisterDragDrop собственную функцию Windows. Когда я пропускаю выполнение QWindowsWindow::registerDropSite, эти 3 потока не создаются. Объяснений о потоках нет даже в документации RegisterDragDrop, не говоря уже о документации Qt. Очевидно, что этот факт может различаться при использовании разных ОС или версий Qt (например, вы можете создавать Qt без поддержки drag-n-drop). Единственный способ узнать, почему потоки были созданы для вас, - это эксперимент. Я думаю, OS X также имеет некоторые сюрпризы для вас.

Четвертый поток для меня - загадка: отладчик не может обнаружить, когда он запущен. Возможно, этот поток вызван отладчиком как-то.

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