Название: приоритеты Отправлено: demaker от Май 30, 2017, 23:34 Скажите, возможно ли дать родительскому
потоку (GUI) более низкиий приоритет чем дочернему? Если да, то не могли бы привести пример как это сделать. Сасибо! Название: Re: приоритеты Отправлено: ksk- от Май 31, 2017, 05:17 http://doc.qt.io/qt-4.8/qthread.html#setPriority (http://doc.qt.io/qt-4.8/qthread.html#setPriority)
Разве нет? Название: Re: приоритеты Отправлено: demaker от Май 31, 2017, 10:21 http://doc.qt.io/qt-4.8/qthread.html#setPriority (http://doc.qt.io/qt-4.8/qthread.html#setPriority) Разве нет? Похоже что нет ??? Может я конечно делаю неправильно что-то. Берем поток и инкрементируем в нем счетчик. Отображаем значение счетчика на индикаторе два раза в секунду. Потоки создаются и запускаются по нажатию кнопки. Когда запускается поток, ему устанавливается приоритет. Вот код Код Во время раьоты программы значения счетчиков постоянно одинаковы, хотя приоритеты у потоков разные. Может я конечно не прав,но получается что в Qt нельзя раздать приорететы потокам. Или это надо делать как-то по особеннолму? Название: Re: приоритеты Отправлено: ksk- от Май 31, 2017, 18:23 Ну тогда придётся написать платформозависимый код.
Например: http://www.yonch.com/tech/82-linux-thread-priority (http://www.yonch.com/tech/82-linux-thread-priority) или https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686277(v=vs.85).aspx (https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686277(v=vs.85).aspx) Название: Re: приоритеты Отправлено: demaker от Май 31, 2017, 19:56 Ну тогда придётся написать платформозависимый код. Спасибо, попробую.Например: http://www.yonch.com/tech/82-linux-thread-priority (http://www.yonch.com/tech/82-linux-thread-priority) или https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686277(v=vs.85).aspx (https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686277(v=vs.85).aspx) Название: Re: приоритеты Отправлено: demaker от Июнь 01, 2017, 14:17 Ну тогда придётся написать платформозависимый код. Спасибо, попробую.Например: http://www.yonch.com/tech/82-linux-thread-priority (http://www.yonch.com/tech/82-linux-thread-priority) или https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686277(v=vs.85).aspx (https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686277(v=vs.85).aspx) К сожалению не помогло. Пробовал для Windows. Функция GetCurrentThread() в MainWondow и в run() потоках возвращает одинаковые значения. Qt функция thread() возвращает разные значения указателей на потоки. Не могу понять ??? ??? ??? Код: Код
Название: Re: приоритеты Отправлено: ViTech от Июнь 01, 2017, 16:43 Попробуйте убрать для начала "msleep(2);". И блокировок слишком много, потоки особо не конкурируют. Лучше сделайте пример, где потоки обращаются к одной переменной: один увеличивает её, другой уменьшает. Там должна быть заметна разница в приоритетах.
Название: Re: приоритеты Отправлено: demaker от Июнь 01, 2017, 17:19 Попробуйте убрать для начала "msleep(2);". И блокировок слишком много, потоки особо не конкурируют. Лучше сделайте пример, где потоки обращаются к одной переменной: один увеличивает её, другой уменьшает. Там должна быть заметна разница в приоритетах. Попробовал как Вы сказали. Один поток работает на увеличение значения, другой поток его уменьшает. Результат примерно такой жe - иногда проскальзывает единица на экран, потом нуль. Вот код: Код
Название: Re: приоритеты Отправлено: ViTech от Июнь 01, 2017, 18:31 1. Приоритет потоку нужно задавать после его старта, об этом выводится отладочное сообщение.
2. Убрать "msleep(2);", это очень большая задержка, там ещё на блокировках и выводе переменной в lcdGUIThread много времени уходит. 3. Увеличить число знаков в ui->lcdGUIThread->setDigitCount(10); Код
С таким кодом у меня нормально приоритеты потоков соблюдаются. Название: Re: приоритеты Отправлено: demaker от Июнь 01, 2017, 19:14 1. Приоритет потоку нужно задавать после его старта, об этом выводится отладочное сообщение. 2. Убрать "msleep(2);", это очень большая задержка, там ещё на блокировках и выводе переменной в lcdGUIThread много времени уходит. 3. Увеличить число знаков в ui->lcdGUIThread->setDigitCount(10); Код
С таким кодом у меня нормально приоритеты потоков соблюдаются. Понял. Спасибо. А поменять приоритет потока gui так Код: thread ()->setPriority (QThread::IdlePriority) Название: Re: приоритеты Отправлено: ViTech от Июнь 01, 2017, 19:21 А поменять приоритет потока gui так Код: thread ()->setPriority (QThread::IdlePriority) Можно. Название: Re: приоритеты Отправлено: demaker от Июнь 02, 2017, 09:59 А вот еще такой вопрос. ::)
Почему когда у меня было два потока с разными приоритетами. У каждого потока свой инкрементный счетчик. То разницы значений счетчиков не было, хотя мне казалось , что у потока с более высоким приоритетом значение счетчика должно быть больше. Разве нет ??? (Или это связанно с тем что процессор не загружен.) Название: Re: приоритеты Отправлено: ViTech от Июнь 02, 2017, 13:38 Причины те же (п. 1, 2). Если система свободна и потоки не конкурируют, то планировщик потоков ОС может и даёт им выполняться на равных условиях, не зависимо от их приоритетов, особенно на многоядерном процессоре. И с задержкой msleep(2) вы, в некоторой степени, синхронизируете потоки. С такой задержкой каждый из них выполнится порядка 500 раз в секунду, не зависимо от приоритета. И такая задержка намного больше времени выполнения "полезного кода". Грубо говоря, изменение счётчика выполняется за несколько микросекунд, а потом он спит 2000 микросекунд. И это с блокировками. Без блокировок разница может быть ещё на порядки больше.
Название: Re: приоритеты Отправлено: demaker от Июнь 02, 2017, 13:44 По поводу msleep.
Когда у меня его нет, то у меня отображение вообще не изменяется. Название: Re: приоритеты Отправлено: ViTech от Июнь 02, 2017, 14:08 Тогда компилируемый проект выкладывайте, чтобы было с чем разбираться.
Название: Re: приоритеты Отправлено: demaker от Июнь 02, 2017, 14:30 Вот проект
Название: Re: приоритеты Отправлено: ViTech от Июнь 02, 2017, 15:04 По поводу msleep. Когда у меня его нет, то у меня отображение вообще не изменяется. Отображение не изменяется, потому что не исправлен пункт 3: Цитировать 3. Увеличить число знаков в ui->lcdGUIThread->setDigitCount(10); lcdGUIThread офигивает от того, сколько всего может сделать современный процессор за секунду, что в 5 цифр по умолчанию не влазит, и он такие числа не отображает :). Название: Re: приоритеты Отправлено: demaker от Июнь 02, 2017, 15:23 По поводу msleep. Когда у меня его нет, то у меня отображение вообще не изменяется. Отображение не изменяется, потому что не исправлен пункт 3: Цитировать 3. Увеличить число знаков в ui->lcdGUIThread->setDigitCount(10); lcdGUIThread офигивает от того, сколько всего может сделать современный процессор за секунду, что в 5 цифр по умолчанию не влазит, и он такие числа не отображает :). |