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

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

Опять треды [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);



Наверх

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