uruchamianie obliczeń co kilka sekund zamiast co każdy tick"

O jezykach programowania w platformach i nie tylko.
pim
Gaduła
Gaduła
Posty: 97
Rejestracja: 19 lut 2015, 09:52

uruchamianie obliczeń co kilka sekund zamiast co każdy tick"

Nieprzeczytany post autor: pim »

Witam.

Mam takie coś że przeszukuje wszystkie obiekty i coś tam z nimi robię (pisałem wcześniej o tym w wątku o automatycznej zmienie własciwosci h-linii).

Cała pętla wyszukująca jest w sekcji start() i wykonuję się non stop po mimo że nic w obiektach się nie zmieniło, widzę że skoczyło zużycie CPU i myślę jak zoptymalizować kod aby tych obliczeń nie robić non stop co każdy tick bo nie jest to potrzebne...

Myśle o jakimś timerze co odpalał by procedury wymagające dużych obliczeń raz na jakiś zdefiniowany czas np. 10 sekund... jednocześnie aby sam nie obciążał zbytnio procka, w pierwszej chwili chciałem zliczać "ticki" ale to nie tędy droga.. więc jak to prosto zrobić ?

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t

Nieprzeczytany post autor: Pablo90 »

Możesz wstawić cały kod? Jeżeli interesuje Cię tylko konkretny rodzaj obiektu, to daj warunek:

Kod: Zaznacz cały

if (typObjektu == okreslonyTyp) {
//tu twój kod
}

Jak wstawisz kod to będzie można pomyśleć nad dalszą optymalizacją, bo myślę, że głównym powodem jest niezoptymalizowany kod.

piter321
Stały bywalec
Stały bywalec
Posty: 77
Rejestracja: 20 lut 2006, 11:08

Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t

Nieprzeczytany post autor: piter321 »

W części init możesz dodać ustawianie swojego interwału:

Kod: Zaznacz cały

int init()
{
currTime = TimeCurrent()+czas_kolejnego_uruchomienia;
}
W części start dodajesz warunki

Kod: Zaznacz cały

int start()
{
  if(TimeCurrent() < currTime)
  {
  return 0;
  }
  currTime = TimeCurrent()+czas_kolejnego_uruchomienia;
 
 //dalsza cześć kodu
}
Powyższe co tick będzie sprawdzało czy należy wykonać obliczenia. Obliczenia nie będą wykonywane częściej niż co "czas_kolejnego_uruchomienia".
Jeżeli potrzebujesz wykonywać kod dokładnie co kilka sekund to pozostaje stworzenie funkcji która będzie wywoływana z init(). W funkcji tej trzeba zawrzeć pętlę nieskończoną weryfikującą czas jak powyżej. W tej nieskończonej pętli trzeba dodać Sleep() z czasem np. 10x mniejszym niż Twoje interwały. Wywołanie Sleep pozwoli procesorowi zająć się innymi zadaniami.

PS. Powyższy kod pisałem z głowy, nie daję gwarancji, że zadziała od ręki :)
Pozdrawiam
Piter

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t

Nieprzeczytany post autor: personov »

A nie prościej zastosować gotową funkcję ?
Zamiast init() daj :

Kod: Zaznacz cały

void OnInit(){EventSetMillisecondTimer(100); 
//wszystko co ma być w init
}
A zamiast start() daj :

Kod: Zaznacz cały

void OnTimer(){
//wszystkie obliczenia
}
Wartość w EventSetMilisecondTimer podawana jest w milisekundach więc w tym wypadku kod wykonuje się co 100ms, ale jak wpiszesz przykładowo 2000 to będzie się wykonywał co 2 sekundy.
Solą życia jest kasa.

Awatar użytkownika
adamForex
Gaduła
Gaduła
Posty: 117
Rejestracja: 28 gru 2015, 10:24

Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t

Nieprzeczytany post autor: adamForex »

Jest też druga wersja tej funkcji, która przyjmuje czas w sekundach:

Kod: Zaznacz cały

EventSetTimer()
https://docs.mql4.com/eventfunctions/eventsettimer

pim
Gaduła
Gaduła
Posty: 97
Rejestracja: 19 lut 2015, 09:52

Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t

Nieprzeczytany post autor: pim »

super, dzięki chłopaki, idąc dalej tym tropem odnalazłem funkcję

CHART_EVENT_OBJECT_CREATE oraz CHARTEVENT_OBJECT_DRAG

i właśnie po tych zdarzeniach chcę wykonywać obliczenia, zaraz spróbuję to zakodować :-)

ODPOWIEDZ