собственно сбоит 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();}
Тоже самое. Сперва думала что ДЛЛ (подключала юзер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();}
А в таймере что выполняется? Что происходит, если одновременно приходят ондеинит и онтаймер ?
Добавить в деинит флаг выхода, и если он тру, то в таймере ретурн )
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
собственно сбоит EventSetTimer стоящий в самом начале OnInit().
говорит что ошибка 4024, "internal error". Как избежать сию ошибку ? Отчего она может возникать..
ах,да - терминал 4.0 build 1090
и DLL конечно-же:
из советника по кнопке дёргается ShellExecute (чтобы открыть отчёт)
и при старте совы порождается новый тред через std::thread в котором всё и живёт синхронизуясь по std::mutex, и прочим..В нитке с советником фактически только "оплётки", вся работа в отдельных тредах.
может есть некие функции которые "настоятельно не рекомендуется" использовать в своих DLL??