|
|
Регистрация | << Правила форума >> | 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; implementation lmikle: Хде теги??? Хто в 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
|
|||
|
|||
Спасибо большое тебе!!! Работает!!! Я твой должник.
|