Alexander Mamontov
Дата: 08.07.2009 05:52:26
Доброго времени всем! Есть такой вопрос, приложение создает поток TThread (класс с переопределенным Execute). При создании этот поток (работа с БД через ФИБ+ и расчеты) нормально выполняется, уничтожается (freeonterminate:=true). Но при повторных созданиях и запусках каждый раз в сеансе запуска процесса выполняется примерно вдвое медленее! После 10-15 итераций поток, что выполнялся в первый раз за 2-3 сек, выполняется около минуты... Народ, подскажите, в чем может быть дело?
Alexander Mamontov
Дата: 08.07.2009 06:55:55
Проверял через process monitor, предыдущий экземпляр потока завершается, нормально разрушается, новый создается... За некоторыми упрощениями все создается так, все стандартно:
var t:TMyThread;
t:=TMyThread.Create(True);
t.FreeOnTerminate:=True;
t.Priority:=tpNormal;
t.Resume;
Смена приоритета не помогает, Synchronize с VCL минимум-просто отображение расчетов, почему же время выполнения увеличивается с каждым разом?
Petro123
Дата: 08.07.2009 07:14:22
Без потоков интервции нормально проходят?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
Alexander Mamontov
Дата: 08.07.2009 07:21:48
Petro123, да, конечно, секунды 2-3, также как и в потоке первый раз, без ошибок типа AV и проч.
Там извлечение данных из БД и расчет с анализом
Petro123
Дата: 08.07.2009 07:50:09
Alexander Mamontov,
если сделать запросы в основном, в анализ в потоках?
Alexander Mamontov
Дата: 08.07.2009 08:01:28
Petro123, в принципе ничто не мешает, пробовал на фикс. наборе данных и если даже вообще
отвлечься от БД, проблема остается. Грубо говоря поток на процессоре выполняется медленее.
Подробнее на счет БД - FireBird 2.1 на ФИБ+, делается простой селект (в ib expert выполняется миллисекунды), через фиб тоже. Уж он точно бы не явился причиной (в этом случае поток идет в БД через отдельное соединение, что и соответствует архитектуре FB). Поток создаю для того, чтобы классически избежать блокировки интерфейса.
p.s. Спасибо Вам за ответы
Petro123
Дата: 08.07.2009 09:12:02
Alexander Mamontov,
- по интерфейсу
Application.ProcessMessage? Или тебе надо прям, "живой-живой"?
- по потокам
проверь их счётчиками в оси XP
- по коду
приведи код, может кто что и нароет
- по архитектуре
что делают пользователи во время расчётов?
----
Одно уже хорошо, что БД к твоему вопросу ни при чём.
ДжекНепотрошитель
Дата: 08.07.2009 10:07:35
Думаю, смотреть надо не туда, где поток создается, а в его Execute
Alexander Mamontov
Дата: 08.07.2009 10:09:18
Petro123, спасибо Вам за рекомендации! Вопрос снят, можно закрыть ветку.
Проблема оказалась, как и почти всегда, в человеческой невнимательности, код в главном
потоке работал корректно, а в параллельном приводил к переполнению серий и структуры данных.
ProcessMessages - в принципе выход, но хотелось через поток.
Пользователи БД могут делать все, что угодно - ходить в БД, менять данные, добавлять и удалять-
поток сделал селект и отключился от нее и работает со своей копией данных