Главная страница
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.009 c
3-88337
s
2002-04-30 09:08
2002.05.27
Удаление записи выскакивает ошибка!


3-88363
Alban
2002-05-01 19:19
2002.05.27
Проблема сохранения данных по MsSQL 7.0


1-88414
mihrutka
2002-05-16 15:02
2002.05.27
Unit was compiled with a different version


1-88417
MisterBin
2002-05-16 21:21
2002.05.27
Ну ответьте плиз


3-88382
suds
2002-05-02 20:02
2002.05.27
НАРОД !!! Кто нить добавлял динамические поля