Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по многопоточным приложениям. [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. В одном потоке работай с данными, в другом делай с расчеты.


Наверх

Титульная страница Поиск, карта сайта Написать письмо