Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приложение тормозит пока не отработает поток [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 оторвет кое-кому не только руки :))


Наверх

Титульная страница Поиск, карта сайта Написать письмо