![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять треды [D5, NT4]
roman_tutov@mail.ru © (2002-05-17 11:24:00)Прочитал я статью на сервере и по образу и подобию попытался
создать в тред в моей программе.
_________________________________________________________________
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...."
Что я сделал не так ?
panov (2002-05-17 15:55:00) [1]Метод Synchronize выполняется в контексте основного потока, поэтому, естественно, основной поток будет тормозиться...
eSKey (2002-05-17 15:30:00) [2]То-ли в мануале (DG.pdf), толи в хелпе написано насчет грамотного использования Synchronize. Смысл в том, что Synchronize нужон для не thread-safe объектов, и его слишком частое использование сводит преимущества многопоточности на нет. Собственно у меня в треде например Synchronize вообще не нужен и не используется, все ОК и очень быстро, правда размер данных невелик, будет время - проверю на чем-нибудь реально БОЛЬШОМ :)
NailS (2002-05-17 15:17:00) [3]Тут как-то url проскакивал
http://compbooks.narod.ru/book_files/TOC.htm
Очень хорошая книга.
Одним словом - рекомендую.
roman_tutov@mail.ru (2002-05-17 14:57:00) [4]Я хемп порыл и ничего понятного для себя не нашел .
Может можно пример кода ?
NailS (2002-05-17 14:50:00) [5]У тебя получается что когда твой поток работает главный виток ждет, т.к. Synchronize реализована через SendMessage().
roman_tutov@mail.ru (2002-05-17 14:30:00) [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;
roman_tutov@mail.ru (2002-05-17 14:24:00) [7]я почитал . Правда я так и не понял в чем ошибка.
Подскажите
eSKey (2002-05-17 13:50:00) [8]А потому что почитай хелп по Synchronize - если у тебя процесс работает как в твоем примере.
roman_tutov@mail.ru (2002-05-17 12:44:00) [9]Ура . Я победил сырость :)
Соединение с базой отрабатывается
отдельным процессом . Правда Остальная
программа в это время все равно замораживается :)
а почему не пойму :(
roman_tutov@mail.ru (2002-05-17 11:41:00) [10]Но сам тред должен лазить в unit Klient
И если я к основному юниту (klient)
подключить unit Tread1 по толучается
циклическая ссылка . Компилятор не пропускает
Victor_Kozel (2002-05-17 11:38:00) [11]Посмотри как делается forward declaration для класса.
Включи в uses Tread1 и убери
type
TMyThread = class(TThread);