Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по многопоточным приложениям.   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.437 c
14-1100354598
Piter
2004-11-13 17:03
2004.12.05
А можно в Object Inspector искать по первым буквам свойства?


4-1098281613
UnDISCOvery
2004-10-20 18:13
2004.12.05
Не могу связать 2 компа через COM-порт. Помогите!


1-1101145962
bimer
2004-11-22 20:52
2004.12.05
always on top


4-1097998753
SniZ
2004-10-17 11:39
2004.12.05
Работа с IrDA


1-1101061585
tormoz
2004-11-21 21:26
2004.12.05
Microsoft Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский