![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
треды [D5, NT4]
roman_tutov © (2002-06-22 11:48:00)пытаюсь программку разбить на треды
В тред вынес процедуры соединения с базой , а в основной
форме сручу бессмысленную анимацию .
Так вот при запуске этого хозяйства код в треде отрабатывает правильно , анимация на главной фовме тоже крутиться ,
но ни одну кнопочку / ползуночек я нажать не могу
и программа перерисовывает только анимацию а на все остильное кладет .
Почему ?
Tutov Roman (2002-06-24 16:09:00) [1]Нет . Ибо по не нашенски я не сильно...Но по русски только с радостью
MBo (2002-06-24 16:07:00) [2]Ссылки на английском нужны?
Tutov Roman (2002-06-24 15:59:00) [3]Lord Warlock © (24.06.02 15:52)
а кто его знает :)
Сильно !
Lord Warlock (2002-06-24 15:52:00) [4]
> Tutov Roman (24.06.02 15:50)
а кто его знает :)
собственно это действие, предпринятое на соответствующую ошибку.
Попробуй переписать для IB/
Form1.ADOConnection1 это твоя Form1.pFIBDatabase1
Tutov Roman (2002-06-24 15:50:00) [5]А что это ?
CoInitialize(Form1.ADOConnection1.VCLComObject);
Lord Warlock (2002-06-24 15:44:00) [6]В общем, у меня получилось без Synchronize(В примере - компоненты ADO, IB у меня нет :) можешь попробовать.
uses ole2;
procedure TMyThreade.Execute;
begin
try
CoInitialize(Form1.ADOConnection1.VCLComObject);
Form1.ADOConnection1.Open;
Form1.ADOTable1.Open;
except
Terminate;
end;
end;
Для IB может не сработать...
Игорь Шевченко (2002-06-24 15:42:00) [7]http://ibase.ru, к примеру. Раздел "Для разработчика"
Tutov Roman (2002-06-24 15:39:00) [8]Да я -бы и рад почитать . Только где ? В примере что с дельфями идет я разобраться не смог ..(
Игорь Шевченко (2002-06-24 15:34:00) [9]Я бы посоветовал вам TFM все-таки почитать, оно полезно. Потому как одним отключением обработчика вы ситуацию не спасете. А проблем таким образом себе создадите.
Lord Warlock (2002-06-24 15:34:00) [10]
> procedure TMyThread.Execute;
> begin
> Form1.pFIBDatabase1.Connected:=true; <-Ошибка будеть здесь
> Form1.pFIBDataset1.Active:=true;
> Form1.pFIBDataset2.Active:=true;
> Form1.pFIBDataSet3.Active:=true;
> end;
Так нельзя, все таки нужно синхронизировать. А OnGetText лечше все таки отключить. Это так:
Field1.OnGetText:=nil;
Включить:
Field1.OnGetText:=Field1OnGetText;
Tutov Roman (2002-06-24 15:28:00) [11]А как на время соединения отключить обработчик OnGetText ?
Игорь Шевченко (2002-06-24 15:26:00) [12]RTFM, RTFM и еще раз RTFM
Tutov Roman (2002-06-24 15:18:00) [13]Хм...получается такой код не допустим ?
procedure TMyThread.Execute;
begin
Form1.pFIBDatabase1.Connected:=true;
Form1.pFIBDataset1.Active:=true;
Form1.pFIBDataset2.Active:=true;
Form1.pFIBDataSet3.Active:=true;
end;
procedure TMyThread.DoWork;
begin
{совсЭм пусто}
end;
end.
И на pFIBDatabase1 к базе не цапанется ?
Lord Warlock (2002-06-24 15:15:00) [14]
> Отключили DbGrid Запустили тред подключились к базе (в треде)
> а затем после отработки треда включили DbGrid
что-то в этом роде...
> валятся в кору все обработчики OnGetText
на время соединения и их отключай
Romkin (2002-06-24 15:11:00) [15]У потока должно быть свое подключение к базе (если через BDE - то своя TSession). И создаваться компоненты доступап должны в методе Execute. Если нужна визуализация - форма тоже должна создаваться в этом методе
Tutov Roman (2002-06-24 15:09:00) [16]Так . Подключени к базе должно тогда выглядеть таким образом ?
Отключили DbGrid Запустили тред подключились к базе (в треде)
а затем после отработки треда включили DbGrid ? Или я опять не про то ?
ЗЫ. Именно по этому валятся в кору все обработчики OnGetText ?
MBo (2002-06-24 15:07:00) [17]примерчик
procedure TinetThread.Execute;
begin
DoWork;
end;
procedure TinetThread.DoWork;
begin
inet:=tnmhttp.create(nil);
try
inet.Get(" http://www.xxxx.yyy.com");
s:=inet.body;
if pos("Status",s)>0 then delete(s,1,pos("Status",s)+5);
...длинная работа со строкой S
except
end;
inet.free;
Synchronize(updatesbar);
end;
procedure tinetthread.updateSBar;
begin
form1.sbar.Panels[10].Text:=s;
end;
Romkin (2002-06-24 15:04:00) [18]Поток предназначен для работы асинхронно с остальными потоками. Вызов Syncronize обеспечивает выполнение метода, передаваемого в него, синхроннос основным потоком. Результат тот же, как если DoWork выполнялся в основном потоке. Синхронизация обычно нужна для визуализации.
В вашем случае в execute потока необходимо создавать все объекты соединения с базой, выполнять работу и затем уничтожать их. В этом случае объекты будут принадлежать потоку, и синхронизация не нужна.
Lord Warlock (2002-06-24 15:03:00) [19]Про Synchronize - это метод блокирует компоненты, к которым идет обращение из функции, указанной как параметр (в данном случае DoWork). Отличается повышенной тормознутостью но необходим для компонентов, у которых нем методов блокировки (Look, UnLook) для того, чтобы при назаначении им скажем Text или Caption на экране не выводилось невесть чего. Т.е. заблокитровали контрол, чего-то ему назначили в функции, разблокировали. Во время блокировки не происходит перерисовывания контрола, и он недоступен. В принципе можно не использовать Synchronize, но тогда могут появиться глюки.
Если ты не изменяешь визуальных контролов в своей функции, Syncronize не нужно в принципе
Игорь Шевченко (2002-06-24 14:59:00) [20]Synchronize заставляет код, указанный в процедуре-аргументе, выполняться в основном потоке, а не в вашем. Тем самым, вы отключаете параллельную работу вашего потока.