![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Кто-нибудь подскажите, пожалуйста, как ускорить или замедлить цикл.
У меня в программе есть график, который изменяется с течением времени. Я хочу его ускорить, либо замедлить. Но этого не получается. То есть пока не пройдет основной цикл, т.е в реальном времени, ускорить или замедлить не получается. Как мне подчинить процедуры друг другу, т.е сделать независимыми. Заранее спасибо. Уже всю голову сломал))) |
|
#2
|
|||
|
|||
|
Ничего не понял. Ты хоть код кинь (не обязательно весь, только значащие части).
|
|
#3
|
|||
|
|||
|
Код:
begin//Распределение насыщенности
//Otvet:= StrToFloat(eVremia.Text);
TTek:=0;
alfT:=1.0;
repeat
pVremia.Enabled:=true;
pVremia.Visible:=true;
Chart1.AnimatedZoom:=true;
Chart1.AnimatedZoomSteps:=8;
Chart2.AnimatedZoom:=true;
Chart2.AnimatedZoomSteps:=8;
Xfr:=dFLfr*Ttek*86400*Uo/m;
RazrabGrafik(TTek);
TTek:=TTek+alfT*dTras;
eVremia.Text:=FloatToStr(Ttek);
repaint;
Sleep(200);
until (TTek>Tras);
end;
procedure TForm1.bZamedlenieClick(Sender: TObject);
begin
alfT:=alfT*0.5;
end;
procedure TForm1.bUskorenieClick(Sender: TObject);
begin
alfT:=alfT*2;
end;Вот у меня есть такой цикл по времени Ttek. Я хочу на форме поставить две кнопки : "Ускорить" и "Замедлить". Но процедуры друг другу не подчиняются. То есть пока не выполнится основной цикл, замедление или ускорение не происходит. Последний раз редактировалось Admin, 13.03.2009 в 15:00. |
|
#4
|
|||
|
|||
|
Ага, понятно. Т.е. не изменить скорость работы самомго цикла, а изменить шаг шкалы.
А где описана переменная alfT? |
|
#5
|
|||
|
|||
|
Код:
private
{ Private declarations }
procedure GrafikFLev;
procedure RazrabGrafik(t: extended);
public
{ Public declarations }
end;
procedure Leveret(Sv,Svo,Sno,nv,nn,mu_v,mu_n:extended; var fkv,fkn,FL:extended);
var
Form1: TForm1;
alfT: extended;
implementationlmikle: Хде теги??? Хто в read-jnly захотел? |
|
#6
|
|||
|
|||
|
1. Я в твоем коде не вижу нигде добавления точек в диаграммы.
2. Проверь все типы данных. Не может там быть попутного округления, типа вычислений с использованием целых и дробных переменных. В этом случае будет округление или нет зависит от порядка следования переменных. А так по логике вполне нормально. |
|
#7
|
|||
|
|||
|
Код:
procedure TForm1.RazrabGrafik(t: extended);
//Ïðîöåäóðà ïîñòðîåíèÿ ãðàôèêà ðàçðàáîòêè
const xo=100;
dds=0.00001;
var fkv,fkn,FL,FL1,dFL,dPk,fkv1,fkn1 : extended;
Sl,Sp,Scr,F,deS: extended;
Iss,Isx: integer;
Sgr,Fvn,Tpr,Svl,Svp,Fun,Svsr,dFLgr:extended;
begin
//Chart3.Enabled:=true;
//Chart3.Visible:=true;
Chart1.BottomAxis.Automatic := false;
Chart1.BottomAxis.Maximum:=L;
Chart1.BottomAxis.Minimum:=0;
Chart1.BottomAxis.Title.Caption:='Äëèíà ãàëåðåè, ì';
Chart1.LeftAxis.Automatic := false;
Chart1.LeftAxis.Title.Caption:='Âîäîíàñûùåííîñòü';
Chart1.LeftAxis.Maximum:=1;
Chart1.LeftAxis.Minimum:=0;
Chart1.RightAxis.Automatic := false;
Chart1.RightAxis.Title.Caption:='Äàâëåíèå, ÌÏà';
Chart1.RightAxis.Maximum:=Pk;
Chart1.RightAxis.Minimum:=0;
Series1.clear;
Series2.clear;
Series3.clear;
Series4.clear;
Series5.clear;
//Series6.clear;
Series7.clear;
//Series8.clear;
Leveret(Svo,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
mXi[0]:=L;
mPi[0]:=0;
if (Xfr<L) then
begin
mSv[0]:=Svo;
mSv[1]:=Svo;
mXi[1]:=Xfr;
mPi[1]:=dPo*(L-Xfr);
mPi[2]:=dPo*(L-Xfr);
for Iss:=2 to Ns do
begin
Sv:=Svfr+(1-Svfr)*(Iss-2)/(Ns-2);
mSv[Iss]:=Sv;
Leveret(Sv+dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
Leveret(Sv-dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv1,fkn1,FL1);
dFL:=(FL-FL1)/(2*dds);
mXi[Iss]:=dFL*t*86400*Uo/m;
if (Iss=2) then mPi[2]:=dPo*(L-Xfr)
else mPi[Iss]:=mPi[Iss-1]+(mXi[Iss-1]-mXi[Iss])*Uo*Mu_v*1000/(k*(fkv+mu_v*fkn/mu_n));
end
end else
begin
mSv[0]:=Svo;
Sl:=Svfr;
Sp:=1-Svo;
repeat
Scr:=0.5*(Sl+Sp);
Leveret(Scr+dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
Leveret(Scr-dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv1,fkn1,FL1);
dFL:=(FL-FL1)/(2*dds);
F:=L-dFL*t*86400*Uo/m;
if (F>0) then Sp:=Scr else Sl:=Scr;
deS:=abs(Sp-Sl);
until (deS<1e-4);
mSv[0]:=Scr;
for Iss:=1 to Ns do
begin
Sv:=Scr+(1-Scr)*Iss/Ns;
mSv[Iss]:=Sv;
Leveret(Sv+dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
Leveret(Sv-dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv1,fkn1,FL1);
dFL:=(FL-FL1)/(2*dds);
mXi[Iss]:=dFL*t*86400*Uo/m;
mPi[Iss]:=mPi[Iss-1]+(mXi[Iss-1]-mXi[Iss])*Uo*Mu_v*1000/(k*(fkv+mu_v*fkn/mu_n));
end
end;
dPk:=Pk-mPi[Ns];
for Iss:=Ns downto 0 do
begin
Series7.AddXY(mXi[Iss],mSv[Iss],'',clTeeColor);
Series5.AddXY(mXi[Iss],dPk+mPi[Iss],'',clTeeColor);
Tpr:=L*m/(uo*dFLfr*86400);
Sl:=Svfr;
Sp:=1;
if t>Tpr then
begin
repeat
Svsr:=0.5*(Sl+Sp);
Leveret(Svsr,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
Leveret(Svsr+dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
Leveret(Svsr-dds,Svo,Sno,nv,nn,mu_v,mu_n,fkv1,fkn1,FL1);
dFL:=(FL-FL1)/(2*dds);
Fun:=dFL-m*L/(uo*t*86400);
if (Fun>0)
then Sl:=Svsr
else Sp:=Svsr;
until (abs(Fun)<dds);
Sgr:=Svsr;
Leveret(Sgr,Svo,Sno,nv,nn,mu_v,mu_n,fkv,fkn,FL);
Series8.AddXY(t,FL,'',clTeeColor);
end;
end; |
|
#8
|
|||
|
|||
|
Это седьмая серия. Ну, как, есть ли у тебя какие-нибудь предложения. Очень буду тебе благодарен!!!
|
|
#9
|
|||
|
|||
|
А всавь ка внутри цикла несколько Application.ProcessMessages.
а то может просто у тебя сообщения не успевают обработаться. |
|
#10
|
|||
|
|||
|
Как же мне ускорить этот цикл. Мне сказали, что есть какие-то функции, отвечающие за это. Но я нигде не могу найти(((
|
|
#11
|
|||
|
|||
|
Да, я читал про это. Но там не очень подробно было описано.
|
|
#12
|
|||
|
|||
|
Спасибо большое тебе!!! Работает!!! Я твой должник.
|