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ć ?
uruchamianie obliczeń co kilka sekund zamiast co każdy tick"
Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t
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.
Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t
W części init możesz dodać ustawianie swojego interwału:
W części start dodajesz warunki
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
Kod: Zaznacz cały
int init()
{
currTime = TimeCurrent()+czas_kolejnego_uruchomienia;
}
Kod: Zaznacz cały
int start()
{
if(TimeCurrent() < currTime)
{
return 0;
}
currTime = TimeCurrent()+czas_kolejnego_uruchomienia;
//dalsza cześć kodu
}
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
Piter
Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t
A nie prościej zastosować gotową funkcję ?
Zamiast init() daj :
A zamiast start() daj :
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.
Zamiast init() daj :
Kod: Zaznacz cały
void OnInit(){EventSetMillisecondTimer(100);
//wszystko co ma być w init
}
Kod: Zaznacz cały
void OnTimer(){
//wszystkie obliczenia
}
Solą życia jest kasa.
Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t
Jest też druga wersja tej funkcji, która przyjmuje czas w sekundach:
https://docs.mql4.com/eventfunctions/eventsettimer
Kod: Zaznacz cały
EventSetTimer()
Re: uruchamianie obliczeń co kilka sekund zamiast co każdy t
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ć
CHART_EVENT_OBJECT_CREATE oraz CHARTEVENT_OBJECT_DRAG
i właśnie po tych zdarzeniach chcę wykonywać obliczenia, zaraz spróbuję to zakodować
