![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по многопоточным приложениям. [D5, WinXP]
Siniy © (2004-11-23 20:38:00)Уважаемые мастера, помогите советом в следующем вопросе:
как одновременно можно проходить курсором по результату запроса который отображается в DBGrid и паралельно в Label-е имитировать бегущую строку (оба компонента находятся на одной форме). По отдельности у меня всё работоет - или беущая строка "бежит" или в DBGrid-е информация прокручивается. Подскажите возможно ли реализовать такой фокус?
KSergey (2004-11-24 10:29:00) [1]> [3] Alexander Panov © (23.11.04 21:03)
> Siniy © (23.11.04 20:57) [2]
> procedure Timer2Timer;
>
> а код Timer2Timer можно увидеть?
А не все ли равно что там, если уже видим
procedure TTesthread.Execute;
begin
FreeOnTerminate:=True;
Synchronize(Timer2Timer);
end;
И в этом корень зла. Все остальное - это уже другой разговор, не имеющий отношения к "неодновременности" работы с данными и бежанию строки в label.
Defunct (2004-11-23 21:36:00) [2]Alexander Panov © (23.11.04 21:30) [5]
> обработку Label, напротив, выполнять либо в основном потоке по таймеру
IMHO проще и правильнее всего.
Defunct (2004-11-23 21:32:00) [3]Siniy © (23.11.04 21:10) [4]
...
while not eof do
begin
Application.ProcessMessages;
Gostring:= trim(FieldByName('MY_MESSAG').asstring);
...
Alexander Panov (2004-11-23 21:30:00) [4]Siniy © (23.11.04 21:10) [4]
у-у, как запущено-то...
Дело в том, что если ты в отдельном потоке хочешь выполнять запрос и обработку результатов, то тебе нужно в в потоке создавать и TDatabase(если используешь) и TQuery, и выполнять запрос в методе Execute(а не в Synchronize).
Расчет и обработку Label, напротив, выполнять либо в основном потоке по таймеру, либо в дополнительном, отличном от потока с запросом.
Siniy (2004-11-23 21:10:00) [5]Вот
procedure TTesthread.Timer2Timer;
var Gostring:string;
j,len: integer;
const LengthGoString = 70;
const i: Integer = 1;
const AmountLatterInString: Integer = 40;
begin
Form1.Timer2.Enabled:=False;
try
with Form1.IBpovidom do begin
Active:=False;
SQL.Clear;
SQL.ADD('SELECT * FROM povidom WHERE Data_n<='+''''+datetostr(date)+''''+' and Data_k>='+''''+datetostr(date)+'''');
Active:=True;
if RecordCount>0 then
begin
First;
GoString:='';
while not eof do begin
Gostring:= trim(FieldByName('MY_MESSAG').asstring);
len:=Length(trim(Gostring));
j:=1;
i:=1;
if Gostring<>'' then
begin
for j:=1 to len-1 do
begin
if Form1.SpeedButton1.Down=False then
begin
Form1.Timer2.Enabled:=False;
exit;
end;
if j< LengthGoString then
begin
Form1.RxLabel4.Caption:=Copy(GoString,1,j);
delay(300);
end;
if (j >= LengthGoString) and (len-i > LengthGoString) then
begin
Form1.RxLabel4.Caption:=Copy(GoString,i,j);
delay(300);
Inc(i);
end;
if len-i <= LengthGoString then
begin
//i:=i+LengthGoString;
Form1.RxLabel4.Alignment:=taLeftJustify;
Form1.RxLabel4.Caption:=Copy(GoString,i,Length(GoString)-i);
delay(300);
Inc(i);
end;
end;
end;
Form1.RxLabel4.Alignment:=taRightJustify;
Form1.RxLabel4.Caption:='';
i:=1;
j:=1;
delay(900);
next;
end;
end;
Active:=False;
Form1.Timer2.Enabled:=True;
end;
except
on e:Exception do begin
if trim(E.ClassName)='EDBEngineError' then
Form1.ErrorMess((E as EDBEngineError).Errors[0].Errorcode,E.Message,E.ClassName)
else
Form1.ErrorMess(0,E.Message,E.ClassName);
end;
end;
end;
Alexander Panov (2004-11-23 21:03:00) [6]Siniy © (23.11.04 20:57) [2]
procedure Timer2Timer;
а код Timer2Timer можно увидеть?
Siniy (2004-11-23 20:57:00) [7]Я так и сделал процедуру Timer2Timerвыполняющую формирование бегущей строки объявил в
type
TTesthread = class(TThread)
private
procedureTimer2Timer;
{ Private declarations }
protected
procedureExecute; override;
End;
procedureTTesthread.Execute;
begin
FreeOnTerminate:=True;
Synchronize(Timer2Timer);
end;
Когда вызывается процедура Timer2Timerто выполнение процедуры по промотке данных в DBGrid-е прерывается.
Как с таким поведением бороться не знаю.
Alexander Panov (2004-11-23 20:44:00) [8]Используй класс TThread. В одном потоке работай с данными, в другом делай с расчеты.