Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизПриложение тормозит пока не отработает поток Найти похожие ветки
← →
alextov (2002-11-20 15:32) [0]Есть приложение для работы с базами данных.
Одна форма главная (с маленьким TTable), и несколько дочерних форм с большими TTable"ами.
Для избежания долгой загрузки приложения я при загрузке открываю TTable только на главной форме,а в файле проекта создаю поток, который загружает данные в TTable (TTable.Open) в нескольких дочерних формах.
....*.dpr........
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Thread1:=TLoadThread.Create(false);
Thread1.Priority:=tpLowest;
Application.Run;
end.
......TThreadMy......
procedure TLoadThread.Execute;
begin
Synchronize(Form2.Table1.Open);
Synchronize(Form3.Table1.Open);
end;
.............................
Но хоть главня форма и появляеться сразу на екране, но курсор представлен в виде песчаных часов (и соответственно приложение не реагирует на действия пользователя) пока не завершиться поток (пока не загрузятся все данные в все TTablы).
Может кто подскажет что я делаю не так ???
← →
Alx2 (2002-11-20 15:35) [1]>alextov (20.11.02 15:32)
Все попытки разгрузить основной поток разбиавются об
Synchronize(Form2.Table1.Open);
Synchronize(Form3.Table1.Open);
PS
Digitman оторвет кое-кому не только руки :))
← →
alextov (2002-11-20 15:46) [2]Но если я правильно читал книги, то обращаться из потока к компонентам VCL настоятельно рекомендуют посредством Synchronize() дабы избежать deadlock"а.
← →
Starkom (2002-11-20 15:50) [3]alextov: правильно читал :) А ты не юзай VCL.
← →
alextov (2002-11-20 15:53) [4]поздно
уже заюзал на всю котушку
← →
Alx2 (2002-11-20 16:10) [5]>alextov (20.11.02 15:53)
Работай в threade со своим экземпляром, а потом готовое переноси в основной поток (если оно там надо, конечно).
← →
Внук (2002-11-20 16:27) [6]Если я все правильно помню (не помню только, где читал, в Калверте?) TTable относится к Thread-safe objects, то есть работу с ним можно не синхронизировать.
← →
Starkom (2002-11-20 16:32) [7]2 Внук - так один фиг там все через критикал секции сделано. Потому и синхронизе не нужен. А работать быстрее не будет.
← →
NailS (2002-11-20 16:33) [8]>посредством Synchronize() дабы избежать deadlock"а.
Вообще-то Synchronize предназначался для других целей ;)
> Starkom ©
> ты не юзай VCL
А не слишком категорично?
Всецело поддерживаю совет Alx2. Вот только думаю, что основное внимание надо уделить потокозащещенности TDatabase (если таковая используется, конечно)
← →
alextov (2002-11-20 16:40) [9]В связи с вышесказанным возникла пара дополнительных вопросов(возможно слегка ламерских)
Alx2 © (20.11.02 16:10)
>>Работай в threade со своим экземпляром, а потом готовое переноси в основной поток (если оно там надо, конечно).
извини, не совсем понял, а как потом готовое переносить в основной поток?
2 NailS © (20.11.02 16:33)
а что подразумевается под потокозащищенностью.
← →
Внук (2002-11-20 16:42) [10]>>Starkom © (20.11.02 16:32)
Критические секции и встраивание одного потока в другой (синхронизация) - это все-таки разные вещи, поэтому не могу согласиться :) Например, в исходниках DOA используют потоки для выполнения запросов.
>>alextov
Все верно, Чарльз Калверт, страница 127.
"Оставшаяся часть VCL в основном не является безопасной для использования в потоках с еще несколькими ключевыми исключениями. Одним из наиболее важных исключений является метод Open для TQuery, TDatabase и TTable..."
← →
Alx2 (2002-11-20 16:45) [11]>alextov (20.11.02 16:40)
Внук рассеял сомнения.
← →
Alx2 (2002-11-20 16:49) [12]>alextov (20.11.02 16:40)
>Alx2 © (20.11.02 16:45)
Выкидывай synchronize
← →
alextov (2002-11-20 17:00) [13]Спасибо всем
Ща попробую...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c