Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.053 c
14-1100074668
Суслик
2004-11-10 11:17
2004.12.05
Где купить delphi6 со всеми сервис паками?


3-1099729172
Леван
2004-11-06 11:19
2004.12.05
кто помнит Dbedit клипера?


4-1098283077
L.evil
2004-10-20 18:37
2004.12.05
TFileStream


9-1090243094
Zak3D[@Tm]
2004-07-19 17:18
2004.12.05
Вопрос по игре Xonix.


14-1100625771
Piter
2004-11-16 20:22
2004.12.05
Как проиграть QuickTime?