Текущий архив: 2004.12.05;
Скачать: CL | DM;
ВнизВопрос по многопоточным приложениям. Найти похожие ветки
← →
Siniy © (2004-11-23 20:38) [0]Уважаемые мастера, помогите советом в следующем вопросе:
как одновременно можно проходить курсором по результату запроса который отображается в DBGrid и паралельно в Label-е имитировать бегущую строку (оба компонента находятся на одной форме). По отдельности у меня всё работоет - или беущая строка "бежит" или в DBGrid-е информация прокручивается. Подскажите возможно ли реализовать такой фокус?
← →
Alexander Panov © (2004-11-23 20:44) [1]Используй класс TThread. В одном потоке работай с данными, в другом делай с расчеты.
← →
Siniy © (2004-11-23 20:57) [2]Я так и сделал процедуру Timer2Timerвыполняющую формирование бегущей строки объявил в
type
TTesthread = class(TThread)
private
procedure Timer2Timer;
{ Private declarations }
protected
procedure Execute; override;
End;
procedure TTesthread.Execute;
begin
FreeOnTerminate:=True;
Synchronize(Timer2Timer);
end;
Когда вызывается процедура Timer2Timer то выполнение процедуры по промотке данных в DBGrid-е прерывается.
Как с таким поведением бороться не знаю.
← →
Alexander Panov © (2004-11-23 21:03) [3]Siniy © (23.11.04 20:57) [2]
procedure Timer2Timer;
а код Timer2Timer можно увидеть?
← →
Siniy © (2004-11-23 21:10) [4]Вот
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:30) [5]Siniy © (23.11.04 21:10) [4]
у-у, как запущено-то...
Дело в том, что если ты в отдельном потоке хочешь выполнять запрос и обработку результатов, то тебе нужно в в потоке создавать и TDatabase(если используешь) и TQuery, и выполнять запрос в методе Execute(а не в Synchronize).
Расчет и обработку Label, напротив, выполнять либо в основном потоке по таймеру, либо в дополнительном, отличном от потока с запросом.
← →
Defunct © (2004-11-23 21:32) [6]Siniy © (23.11.04 21:10) [4]
...
while not eof do
begin
Application.ProcessMessages;
Gostring:= trim(FieldByName("MY_MESSAG").asstring);
...
← →
Defunct © (2004-11-23 21:36) [7]Alexander Panov © (23.11.04 21:30) [5]
> обработку Label, напротив, выполнять либо в основном потоке по таймеру
IMHO проще и правильнее всего.
← →
KSergey © (2004-11-24 10:29) [8]> [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.
Страницы: 1 вся ветка
Текущий архив: 2004.12.05;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.048 c