почему может сбоить EventSetTimer() ?

 

собственно сбоит EventSetTimer стоящий в самом начале OnInit().

говорит что ошибка 4024, "internal error". Как избежать сию ошибку ? Отчего она может возникать..

ах,да - терминал 4.0 build 1090

и DLL конечно-же:

из советника по кнопке дёргается ShellExecute (чтобы открыть отчёт)

и при старте совы порождается новый тред через std::thread в котором всё и живёт синхронизуясь по std::mutex, и прочим..В нитке с советником фактически только "оплётки", вся работа в отдельных тредах.

может есть некие функции которые "настоятельно не рекомендуется" использовать в своих DLL??

 
Maxim Kuznetsov:

собственно сбоит EventSetTimer стоящий в самом начале OnInit().

говорит что ошибка 4024, "internal error". Как избежать сию ошибку ? Отчего она может возникать..

ах,да - терминал 4.0 build 1090

и DLL конечно-же:

из советника по кнопке дёргается ShellExecute (чтобы открыть отчёт)

и при старте совы порождается новый тред через std::thread в котором всё и живёт синхронизуясь по std::mutex, и прочим..В нитке с советником фактически только "оплётки", вся работа в отдельных тредах.

может есть некие функции которые "настоятельно не рекомендуется" использовать в своих DLL??

если кто столкнётся со схожей проблемой - метод обхода проблемы:

сложно сказать с чем сие связанно, но как временный костыль помогает Sleep(1000) в конце OnDeinit(). Тогда при перекомпиляции или рестарте советника EventSetTimer работает корректно.
Странно, потому как все порождённые нитки к этому моменту(к завершению OnDeinit) завершаются..Но может windows не успевает разбирается со службой времени и случается фигня - все операции DeInit ещё не завершены терминалом, а следующий OnInit уже начался.

 

Сталкивался с подобной проблемой, сначала делал цикл в 5 итераций с задержкой в секунду.

Потом забил, просто выходил из инита по ошибке, так сказать передал перезапуск на откуп пользователю.

Врядли зависит от длл, так как при обнаружении проблемы, сделал пустой тест (только mql4), так у одного брокера стабильно после запуска терминала вылетал сет таймер с ошибкой, потом перестало, в общем мутная фиготень :)

 

Тоже самое. Сперва думала что ДЛЛ (подключала юзер32), но убрала все, а советник так же выдает 4024. Такое же при установке миллисекунд так и секунд в разном кол-ве. Так же и Слип в деините не спас. 

Работает только такая конструкция в индикаторе, а вот советник никак

#property strict

int OnInit(){

   if(!EventSetMillisecondTimer(100)) Print("EventSetMillisecondTimer  err = "+IntegerToString(GetLastError()));  

   return(INIT_SUCCEEDED);}

void OnTimer(){}

void OnDeinit(const int reason){

   EventKillTimer();}

 
Galina Bobro:

Тоже самое. Сперва думала что ДЛЛ (подключала юзер32), но убрала все, а советник так же выдает 4024. Такое же при установке миллисекунд так и секунд в разном кол-ве. Так же и Слип в деините не спас. 

Работает только такая конструкция в индикаторе, а вот советник никак

#property strict

int OnInit(){

   if(!EventSetMillisecondTimer(100)) Print("EventSetMillisecondTimer  err = "+IntegerToString(GetLastError()));  

   return(INIT_SUCCEEDED);}

void OnTimer(){}

void OnDeinit(const int reason){

   EventKillTimer();}

пришлось заводить флаг bool timerIsSet и если он не поставился в OnInit от EventSetTimer, то пытаться выставить в тиках..Там видимо хитрая зависимость между нитками MetaTrader, таймерами Windows и наличием связи (и тиков) от DC.
 

А в таймере что выполняется? Что происходит, если одновременно приходят ондеинит и онтаймер ?

Добавить в деинит флаг выхода, и если он тру, то в таймере ретурн )

 
Поставила сек задержки - через раз работает. Явно что-то с ДЛЛ - если перегрузить комп (перезапуск терминала не помог) то работает таймер норм, а если попал на ошибку эту с ДЛЛ то потом постоянно сбоит, даже если нет длл в сове. 

Интересная идея с выходом таймера, попробую завтра а вдруг