Russian Qt Forum

Qt => Общие вопросы => Тема начата: Steven_Orko от Июнь 08, 2007, 10:19



Название: QThread Qt 3.3.x
Отправлено: Steven_Orko от Июнь 08, 2007, 10:19
В силу необходимости использую такую версию Qt. В ней в классе QThread нет сигнала finished(), который есть в Qt 4, в принципе, по понятным причинам. Однако, мне необходимо узнать о том, что функция потока завершилась именно в тот момент, когда она завершилась. Кто-нибудь делал такое? Для чего это надо... В процессе работы создаю несколько десятков потоков по необходимости. Т.к. каждый объект QThread занимает память, то хочу его удалять после того, как поток завершится, но не знаю, как отследить этот момент.
Цикл
Код:

while (true)
{
}

в отдельном потоке занимает 100% процессорного времени, нужно ставить какие-то QWaitCondition. Вот только как узнать момент, в который надо сигналить?


P.S. ОС Linux, 2.6.x.


Название: QThread Qt 3.3.x
Отправлено: Sergeich от Июнь 08, 2007, 12:48
Попробуй заюзать QApplication::postEvent в конце ф-ции потока


Название: QThread Qt 3.3.x
Отправлено: Steven_Orko от Июнь 13, 2007, 08:55
Попробовал. Эта штука в большинстве случаев работает правильно, но вот нет, нет, да и появится поток, который еще не успел почему-то завершится при обработке данного события ((((((((...

Я решил добавить еще одну синхронизацию, и отслеживать кол-во потоков до выполняемого действия и после... ща попробую, вроде должно сработать. Да, еще эти потоки надоть отсоединить, чтобы ресурсы сразу освобождались по завершению потока.


Название: QThread Qt 3.3.x
Отправлено: Racheengel от Июнь 13, 2007, 09:37
Можно добавить

while (true)
{
...
sleep(100);
}

чтобы 100% времени не отжиралось.


Название: QThread Qt 3.3.x
Отправлено: Steven_Orko от Июнь 13, 2007, 13:15
Ага, тож делал так, но все равно, не есть хорошо, потому что в зависимости от процессора, время занятости тоже довольно сильно варьируется, причем, у меня начиная примерно от 8%.... это не есть хорошо ))))


Название: QThread Qt 3.3.x
Отправлено: Sergeich от Июнь 13, 2007, 16:39
Цитата: "Steven_Orko"
Попробовал. Эта штука в большинстве случаев работает правильно, но вот нет, нет, да и появится поток, который еще не успел почему-то завершится при обработке данного события ((((((((...
Сделай в обработчике событий wait  для завершающегося потока, если postEvent стоит в самом конце ф-ции потока, то он должен отработать мгновенно и не тормозить главный событийный цикл.


Название: QThread Qt 3.3.x
Отправлено: Steven_Orko от Июнь 13, 2007, 17:49
Я уже решил проблемму с помощью платформо-зависимого кода... Все равно у меня многопоточный сервер написан с использованием pthreads Linuxa... И использоваться будет только в Linux.
А с wait я играл, в разные места ставил... Твой вариант самый оптимальный оказался ))))) Но мне показалось, что использовать wait не комильфо ))))