Как на создавать потоков по количеству ядер, а потом завершить их? |
Здравствуйте, гость ( Вход | Регистрация )
Как на создавать потоков по количеству ядер, а потом завершить их? |
RazrFalcon |
5.11.2011, 16:33
Сообщение
#1
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Циклично создаются потоки:
Затем на cleaningFinished я вызываю:
Это нормальное решение или есть более правильное? И как можно завершить все потоки? ака кнопка "стоп". Сообщение отредактировал RazrFalcon - 5.11.2011, 16:39 |
|
|
RazrFalcon |
5.11.2011, 18:38
Сообщение
#2
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Пока что остановился на таком варианте:
и
Нормальное решение? Вроде пашет. |
|
|
PAFOS |
10.11.2011, 14:40
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
не следует удалять сигнальщика в слоте. для этого есть deleteLater() |
|
|
RazrFalcon |
10.11.2011, 15:38
Сообщение
#4
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
|
|
|
PAFOS |
16.11.2011, 8:12
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
ну а иначе рискуешь получить Segfauilt в неожиданном месте.
Создай отдельный список и храни там указатели на потоки в слоте workFinished()
th->deleteLater(); - после этого указатель на QThread уже можно терять. |
|
|
RazrFalcon |
16.11.2011, 8:20
Сообщение
#6
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Сегфолтов пока не наблюдал.
Плодить кучу переменых/списков нет желания. Люблю там где нужно получать переменные. |
|
|
RazrFalcon |
18.11.2011, 18:11
Сообщение
#7
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
нашел еще один способ:
Не знаю в чем разница между но результат то же.
|
|
|
Гость_Гость_* |
10.1.2012, 10:53
Сообщение
#8
|
Гости |
RazrFalcon, cскажите как узнаёте сколько ядер в системе?
Спасибо. |
|
|
RazrFalcon |
14.1.2012, 0:35
Сообщение
#9
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
|
|
|
Влад |
16.1.2012, 12:19
Сообщение
#10
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Хм, ну, как оно там точно организовано в ядре Линуксов, это я не знаю, но в Виндоус есть еще такая тонкость: мало насоздавать потоков (процессов) по числу ядер, надо еще не забыть привязать каждый поток/процесс к конкретному ядру. Там для этого предусмотрены специальные функции типа SetThreadAffinityMask() или что-то подобное (лезть в MSDN и уточнять сейчас лень). В противном случае, планировщик все равно имеет возможность по своему усмотрению перекидывать потоки с ядра на ядро, со всеми сопутствующими накладными расходами, - а оно тебе надо?
|
|
|
Текстовая версия | Сейчас: 27.11.2024, 14:41 |