![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приложение тормозит пока не отработает поток [D5, NT4]
alextov © (2002-11-20 15:32:00)Есть приложение для работы с базами данных.
Одна форма главная (с маленьким 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ы).
Может кто подскажет что я делаю не так ???
alextov (2002-11-20 17:00:00) [1]Спасибо всем
Ща попробую...
Alx2 (2002-11-20 16:49:00) [2]>alextov (20.11.02 16:40)
>Alx2 © (20.11.02 16:45)
Выкидывай synchronize
Alx2 (2002-11-20 16:45:00) [3]>alextov (20.11.02 16:40)
Внук рассеял сомнения.
Внук (2002-11-20 16:42:00) [4]>>Starkom © (20.11.02 16:32)
Критические секции и встраивание одного потока в другой (синхронизация) - это все-таки разные вещи, поэтому не могу согласиться :) Например, в исходниках DOA используют потоки для выполнения запросов.
>>alextov
Все верно, Чарльз Калверт, страница 127.
"Оставшаяся часть VCL в основном не является безопасной для использования в потоках с еще несколькими ключевыми исключениями. Одним из наиболее важных исключений является метод Open для TQuery, TDatabase и TTable..."
alextov (2002-11-20 16:40:00) [5]В связи с вышесказанным возникла пара дополнительных вопросов(возможно слегка ламерских)
Alx2 © (20.11.02 16:10)
>>Работай в threade со своим экземпляром, а потом готовое переноси в основной поток (если оно там надо, конечно).
извини, не совсем понял, а как потом готовое переносить в основной поток?
2 NailS © (20.11.02 16:33)
а что подразумевается под потокозащищенностью.
NailS (2002-11-20 16:33:00) [6]>посредством Synchronize() дабы избежать deadlock"а.
Вообще-то Synchronize предназначался для других целей ;)
> Starkom ©
> ты не юзай VCL
А не слишком категорично?
Всецело поддерживаю совет Alx2. Вот только думаю, что основное внимание надо уделить потокозащещенности TDatabase (если таковая используется, конечно)
Starkom (2002-11-20 16:32:00) [7]2 Внук - так один фиг там все через критикал секции сделано. Потому и синхронизе не нужен. А работать быстрее не будет.
Внук (2002-11-20 16:27:00) [8]Если я все правильно помню (не помню только, где читал, в Калверте?) TTable относится к Thread-safe objects, то есть работу с ним можно не синхронизировать.
Alx2 (2002-11-20 16:10:00) [9]>alextov (20.11.02 15:53)
Работай в threade со своим экземпляром, а потом готовое переноси в основной поток (если оно там надо, конечно).
alextov (2002-11-20 15:53:00) [10]поздно
уже заюзал на всю котушку
Starkom (2002-11-20 15:50:00) [11]alextov: правильно читал :) А ты не юзай VCL.
alextov (2002-11-20 15:46:00) [12]Но если я правильно читал книги, то обращаться из потока к компонентам VCL настоятельно рекомендуют посредством Synchronize() дабы избежать deadlock"а.
Alx2 (2002-11-20 15:35:00) [13]>alextov (20.11.02 15:32)
Все попытки разгрузить основной поток разбиавются об
Synchronize(Form2.Table1.Open);
Synchronize(Form3.Table1.Open);
PS
Digitman оторвет кое-кому не только руки :))