Название: Непонятно поведение потока. Отправлено: west от Ноябрь 23, 2008, 01:07 Столкнулся тут с такой ситуацией. Правил, правда, чужой код, но суть следующая. В проге есть функция (чего делает точно не знаю, память гоняет туда-сюда), которая вешает ГПИ минут на 15. Организую для нее поток, прога выполняется корректно, но ГПИ все равно виснет на те же 15 минут. Проверяю, стартует ли нить с помощью top`а и ps`а. Нитка выполняется и завершается корректно, но ГПИ при этом или висит, или в глубоком тормозе. В топе отжирает 97-99 процентов CPU. В ps`е статус нитки R+, а вот у ГПИ-шного процесса S+. Чего-то никогда такого не наблюдал. Даже если нить забирала много ресурсов, ГПИ был доступен, а тут реально висяк, элементы UI даже не перерисовываются. На нить же не повесить приоритеты? Есть у кого какие мысли?
Linux(MCBC), Qt3 (потоки тоже qt). lock()`и отсутствуют. Аппаратная платформа SPARC аж на 4-х процах, Эльбрус родной т.е. Название: Re: Непонятно поведение потока. Отправлено: lit-uriy от Ноябрь 23, 2008, 04:18 что такое ГПИ?
может в Qt3 можно приоритет потоку задать? (в 4-ке можно+) Название: Re: Непонятно поведение потока. Отправлено: novak от Ноябрь 23, 2008, 08:49 что такое ГПИ? Судя по всему, GUI. В виде "графический пользовательский интерфейс".Название: Re: Непонятно поведение потока. Отправлено: pastor от Ноябрь 23, 2008, 15:35 2 west: покажи код потока
Название: Re: Непонятно поведение потока. Отправлено: BRE от Ноябрь 23, 2008, 16:25 2 west: Желательно глянуть и как поток запускается/останавливается, нет ли там wait'ов каких.
Название: Re: Непонятно поведение потока. Отправлено: west от Ноябрь 24, 2008, 11:05 Выкладываю немного в сокращенном виде код. Кстати, неполенился перетащить на ALT4.0 под intel, все работает... Надо рыть значит где-то в другом месте.
Это описание класса управления потоком, ( класс разрабатывал специально для удобства применения в чужом коде): Код:
Код: #include "k_threadmanager.h" Это применение указанного выше указанного класса, собственно тот самый чужой код, который мучаю, в сильно сокращенном варианте: Код:
Название: Re: Непонятно поведение потока. Отправлено: pastor от Ноябрь 24, 2008, 11:59 Ну собственно говоря ничего удивительного. Замораживание интерфейса происходит из-за вызова метода applyFunction в K_ThreadManager::run(). applyFunction (а это AnyData::startBuild) создаеться\находиться\выполняеться в главном потоке. в доп. потоке вы только вызываете этот метод. ЧТобы достить эелаемого результета, должно быть что-то следующее:
Код
При условии что AnyData не являеться гуи класом и в startBuild() непроисходит обращения к гую. Название: Re: Непонятно поведение потока. Отправлено: west от Ноябрь 24, 2008, 12:41 Често говоря я так не думаю. Или не очень понимаю
Цитировать создаеться\находиться\выполняеться в главном потоке - Вы имеете ввиду объектный код функции?Какая разница какая функция (с точки зрения где она находится) выполняется в потоке. Да и закоментировал сейчас тело startBuild(), и воткнул туды while бесконечный. Не виснет гуи. Надо похоже ковырять глубже юзерский код, чего там они наваяли за расчеты... Может блокирующий вызов где нибудь спрятался? Почему на Intel архитектуре работает, а на Sparc нет? Название: Re: Непонятно поведение потока. Отправлено: pastor от Ноябрь 24, 2008, 13:01 Объект AnyData создался в главном потоке, метод startBuild также находиться в главном потоке. Вызов этого метода происходит в доп потоке, но выполняеться он в главном, поэтому гуй умирает. Проверьте это при помощи QThread::currentThread() добавив вызовы в K_ThreadManager::run() и в AnyData::startBuild()
Название: Re: Непонятно поведение потока. Отправлено: west от Ноябрь 24, 2008, 14:53 Ну я проверил.
Цитировать Проверьте это при помощи QThread::currentThread() добавив вызовы в K_ThreadManager::run() и в AnyData::startBuild() идентификаторы совпадают. т.е. Функция выполняется в потоке. Для точности воткнул еще QThread::currentThread() в void AnyData::slotBuildModel(), до создания объекта thread, идентификатор гуевой нитки отличен от полученного в run() и в startBuild(). Все нормально, функция выполняется в потоке. Гемор в чем-то другом. Название: Re: Непонятно поведение потока. Отправлено: SASA от Ноябрь 24, 2008, 16:15 В Qt 4.4 есть QtConcurrent. Решает те же задачи. Может посмотреть там и списать :)
Название: Re: Непонятно поведение потока. Отправлено: pastor от Ноябрь 24, 2008, 16:34 Ну я проверил. Цитировать Проверьте это при помощи QThread::currentThread() добавив вызовы в K_ThreadManager::run() и в AnyData::startBuild() идентификаторы совпадают. т.е. Функция выполняется в потоке. Для точности воткнул еще QThread::currentThread() в void AnyData::slotBuildModel(), до создания объекта thread, идентификатор гуевой нитки отличен от полученного в run() и в startBuild(). Все нормально, функция выполняется в потоке. Гемор в чем-то другом. Кстате да, я был неправ. Я состряпал примерчик - все работает, гуй не замораживаеться. А что происходит в startBuild()? Название: Re: Непонятно поведение потока. Отправлено: west от Ноябрь 24, 2008, 23:53 Да там без поллитры не разобрать. Я вот и пытаюсь понять в теории, что там может быть такого, что вот такое получается ???. И исходя из теории проверять методом исключения. Из-за чего поток может вешать гуй?
Вообще-то, там математические алгоритмы по расчету моделей поверхностей объетов сложных форм. Работают с ОП только, но выделяют ее до фига, и не вседа корректно. Название: Re: Непонятно поведение потока. Отправлено: pastor от Ноябрь 25, 2008, 12:59 А из главного потока точно никто не дергает метод startBuild() когда он выполняеться в вспомогательном потоке?
ЗЫ: В вашей реализации лучше защитить мютексом startBuild(), т.к. он не являеться потокобезопасным. Возможно главный поток пытаеться выполнить startBuild() в то время как этот же метод выполняетья в вспомогательном потоке. Попробуй сделать так: Код
Название: Re: Непонятно поведение потока. Отправлено: west от Ноябрь 25, 2008, 14:20 Цитировать лучше защитить мютексом startBuild(), т.к. он не являеться потокобезопасным Кстати да! |