Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Синхронизация


Автор: kindDevil 8.2.2007, 14:54
есть поцедура

Код

 procedure Count_Koefficients;
  var i,j:integer;
    ks1,ks2,ks3:string;
  begin
      k1 := 0;
      k2 := 0;
      k3 := 0;

          for i := Border1.Min to Border1.Max do
               k1 := k1 + F_Massive[i];

          for i := Border2.Min to Border2.Max do
               k2 := k2 + F_Massive[i];

          for i := border1.Min to Border2.Max do
               k3 := k3 + F_Massive[i];

      k1 := k1/((N+Mass_Osnast)*(Border1.Max - Border1.Min)*(U/Mass_Tar_gr));
      k2 := k2/((N+Mass_Osnast)*(Border2.Max - Border2.Min)*(U/Mass_Tar_gr));
      k3 := k3/((N+Mass_Osnast)*(Border2.Max - Border1.Min)*(U/Mass_Tar_gr));

      writeln (File_lst,inttostr(Cur_H_Period div 2)+' '+floattostr(k1)+' '+floattostr(k2)+' '+floattostr(k3));
      ks1 := floattostr(k1);
      ks2 := floattostr(k2);
      ks3 := floattostr(k3);
        for j := 3 to length (ks1) do
          delete(ks1,j,1);
        for j := 3 to length (ks2) do
          delete(ks2,j,1);
        for j := 3 to length (ks3) do
          delete(ks3,j,1);
      pole.Lines.Add(' ¹ '+inttostr(Cur_H_Period div 2)+' | '+ks1+' | '+ks2+' | '+ks3);
      
      inc(x_point);
      y_point := trunc(k3*100);
      field.canvas.moveto (x_point,0);  
      field.canvas.lineto(x_point,y_point);

      if (Cur_H_Period div 2)  mod Per_meter = 0 then begin
                                                   assignfile (File_grf,filename+'.grf');
                                                   reset(File_grf);
                                                   seek(file_grf,filesize(file_grf));
                                                   write (file_grf,F_Massive);
                                                   closefile(file_grf);
                                                  end;
  end;



она выполняется в цикле:

Код


REPEAT
    if End_of_Full_Period then
        begin
           for i:= 306 to 611 do
                F_Massive[i] := work;
        Count_Koefficients;
         end;
UNTIL End_of_cycle;
 


так вот почему-то кусок кода из процедуры Count_Koefficients

Код

      inc(x_point);
      y_point := trunc(k3*100);
      field.canvas.moveto (x_point,0);  
      field.canvas.lineto(x_point,y_point);


подчистую игнорируется.
т.е. во время работы цикла выводится только текст в memo с именем pole,
а на канву картинки field графика выводится только когда цикл заканчивается, а требуется чтобы все происхоило синхронно.
в чем причина такой задержки? как это можно исправить?  smile уже 3 часа мучаюсь...

Автор: Rennigth 8.2.2007, 15:09
Код

REPEAT
    if End_of_Full_Period then
        begin
           for i:= 306 to 611 do
                F_Massive[i] := work;
        Count_Koefficients;
        Application.ProcessMessages;
         end;
UNTIL End_of_cycle;


Memo просто умеет сама себя обновлять, а канву надо ручками. Самое простое это  воткнуть Application.ProcessMessages

Добавлено @ 15:12 
или field.Invalidate 
PS: незнаю кто такой field у тебя.

Автор: kindDevil 8.2.2007, 16:05
у меня. 
field : TImage
и самое странное, что вся картинка, которая должна была рисоваться постепенно, отображается сразу.
это и связано с тем, что нужно обновление? 
не совсем понимаю, но спасибо

Автор: aktuba 10.2.2007, 20:09
Цитата

и самое странное, что вся картинка, которая должна была рисоваться постепенно, отображается сразу.
это и связано с тем, что нужно обновление? 
не совсем понимаю, но спасибо 


А что именно не понятно? Канва обновляется, когда обновляется форма, т.е. при поступлении сообщения WM_Paint. Если ты что-то отрисовываешь на канве, то все изменения будут происходить во время перерисовки формы. Для этого тебе и предложили использовать Application.ProcessMessages;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)