QThread :: idealThreadCount () всегда возвращает "2" - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно отобразить в QSpinBox количество ядер или потоков, которые имеет процессор.Проблема:

QThread cpuInfo(this); //get CPU info
ui->spnBx_nmb_nodes->setValue(cpuInfo.idealThreadCount()); //get thread count

Это всегда возвращает «2».Я попробовал в ноутбуке "2 ядра / 4 потока";компьютер «4 ядра / 8 потоков» и сервер «12 ядер / 24 потока».Во всех случаях это возвращает «2» в качестве идеального числа потоков.

Может кто-нибудь, пожалуйста, подскажите мне немного?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Попробуйте следующий код:

auto const value = 8;
auto *nmb_nodes = ui->spnBx_nmb_nodes;
nmb_nodes->setValue(value);
Q_ASSERT(nmb_nodes->value() == value);

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

0 голосов
/ 03 октября 2018
Реализация

idealThreadCount() отличается в разных ОС:

В Windows QThread::idealThreadCount() вызывает функцию Win32 GetNativeSystemInfo () и по ее результатам возвращает dwNumberOfProcessors* значение из структуры SYSTEM_INFO, которое вызывает.

В Linux (и большинстве других Unix-y ОС) QThread::idealThreadCount() вызывает sysconf (_SC_NPROCESSORS_ONLN) и возвращает это значение.

В MacOS / X (и BSD и iOS) QThread::idealThreadCount() вызывает sysctl (CTL_HW, HW_NCPU) и возвращает полученное оттуда значение.

QThread::idealThreadCount() также содержит некоторые другие серверные реализации для менее часто используемых ОС, которые я не буду здесь резюмировать;если вам нужно искать себя, код находится в строках 461-515 из qtbase/src/corelib/thread/qthread_unix.cpp.

Учитывая все вышесказанное, вопрос сводится к тому, почему OS-команда(что Qt вызывает до), возвращая 2 вместо более подходящего номера?Для меня это звучит как ошибка, хотя еще одна возможность состоит в том, что idealThreadCount() возвращает правильное число, но ваш QSpinBox почему-то ограничивает это число до 2.Если вы еще этого не сделали, я предлагаю распечатать значение, возвращаемое cpuInfo.idealThreadCount() напрямую, в дополнение к передаче setValue(), просто чтобы быть уверенным.

...