Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.27;
Скачать: CL | DM;

Вниз

Опять треды   Найти похожие ветки 

 
roman_tutov@mail.ru   (2002-05-17 11:24) [0]

Прочитал я статью на сервере и по образу и подобию попытался
создать в тред в моей программе.
_________________________________________________________________

unit Tread1;
interface
uses
Classes,Klient;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;
implementation

procedure TMyThread.Execute;
begin
while not Terminated do
Synchronize(DoWork);
end;

procedure TMyThread.DoWork;
begin

{
мой код
}

end;
end.
__________________________________________________________

Вызываю так из другого юнита


type
TMyThread = class(TThread);


var
T1 : TMyThread;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
T1 := TMyThread.Create(False);
end;
end;
__________________________________________________________
При вызове процедуры программа падает с "абстрактной ошибкой "
Прямо так и пишет "Abstract Errror in module...."

Что я сделал не так ?


 
Victor_Kozel   (2002-05-17 11:38) [1]

Посмотри как делается forward declaration для класса.
Включи в uses Tread1 и убери
type
TMyThread = class(TThread);




 
roman_tutov@mail.ru   (2002-05-17 11:41) [2]

Но сам тред должен лазить в unit Klient
И если я к основному юниту (klient)
подключить unit Tread1 по толучается
циклическая ссылка . Компилятор не пропускает


 
roman_tutov@mail.ru   (2002-05-17 12:44) [3]

Ура . Я победил сырость :)
Соединение с базой отрабатывается
отдельным процессом . Правда Остальная
программа в это время все равно замораживается :)
а почему не пойму :(


 
eSKey   (2002-05-17 13:50) [4]

А потому что почитай хелп по Synchronize - если у тебя процесс работает как в твоем примере.


 
roman_tutov@mail.ru   (2002-05-17 14:24) [5]

я почитал . Правда я так и не понял в чем ошибка.
Подскажите


 
roman_tutov@mail.ru   (2002-05-17 14:30) [6]

из хелпа

This example shows how to call a button’s click method in a thread-safe manner:

procedure TMyThread.PushTheButton;

begin
Button1.Click();
end;

procedure TMyThread.Execute;
begin
...
Synchronize(PushTheButton);
...
end;


 
NailS ©   (2002-05-17 14:50) [7]

У тебя получается что когда твой поток работает главный виток ждет, т.к. Synchronize реализована через SendMessage().


 
roman_tutov@mail.ru   (2002-05-17 14:57) [8]

Я хемп порыл и ничего понятного для себя не нашел .
Может можно пример кода ?


 
NailS ©   (2002-05-17 15:17) [9]

Тут как-то url проскакивал

http://compbooks.narod.ru/book_files/TOC.htm

Очень хорошая книга.
Одним словом - рекомендую.


 
eSKey   (2002-05-17 15:30) [10]

То-ли в мануале (DG.pdf), толи в хелпе написано насчет грамотного использования Synchronize. Смысл в том, что Synchronize нужон для не thread-safe объектов, и его слишком частое использование сводит преимущества многопоточности на нет. Собственно у меня в треде например Synchronize вообще не нужен и не используется, все ОК и очень быстро, правда размер данных невелик, будет время - проверю на чем-нибудь реально БОЛЬШОМ :)


 
panov ©   (2002-05-17 15:55) [11]

Метод Synchronize выполняется в контексте основного потока, поэтому, естественно, основной поток будет тормозиться...



Страницы: 1 вся ветка

Текущий архив: 2002.05.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
14-88595
Alx3
2002-04-16 05:49
2002.05.27
TDBGrid & Mouse


7-88645
Mulder
2002-03-01 18:12
2002.05.27
Помогите начинающему...


1-88413
Keymaster
2002-05-16 18:37
2002.05.27
Как отключить Memo?


1-88479
Саня
2002-05-15 12:23
2002.05.27
о Делфи


1-88443
Дмитрий757567
2002-05-17 13:59
2002.05.27
HALT - НЕ НОРМАЛЬНЫЙ