Вниз
Скачать: CL | DM;

Приложение тормозит пока не отработает поток   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.01 c
1-4442
SONY
2002-11-20 08:11
2002.12.02
Календарь на HTML


3-4211
Геннадий
2002-11-12 21:42
2002.12.02
При удалении дублир-щих записей удал-ся ВСЕ. А как оставить одну?


1-4381
Dmitry1
2002-11-22 14:00
2002.12.02
Размер активного окна


3-4216
pavelsinicinv
2002-11-14 10:40
2002.12.02
вводить время больше 23:59:59 (поле имеет тип Time) к примеру 145


3-4249
_pavel_
2002-11-14 13:53
2002.12.02
Apollo и даты




   Наверх