Форум: "Основная";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
ВнизОпять треды Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c