Эмуляция прерываний в MQL4? - страница 2

 

Это между прочим тоже - PostMessageA(HandlWindow, WM_COMMAND, 33324, 0);

Тогда оконные сообщения тоже нельзя использовать ?

 
xrust:

Это между прочим тоже - PostMessageA(HandlWindow, WM_COMMAND, 33324, 0);

Тогда оконные сообщения тоже нельзя использовать ?

Рустам, это врядли менять будут. Про инит прямо в справке написано, что нельзя зацикливать!!! Если сейчас работает, то запросто исправят это безобразие без предупреждения в следующем билде, и работать не будет, а ты будешь искать почему у тебя все программы перестали работать.
 
работает, и работать будет, ибо не будет следующих билдов.
 
В общем, буду зацикливаться в старт(), хотя огромный соблазн сделать это в инит(). Использую графические элементы (лейблы), как контролы. Размещая их в "активных" зонах чарта думаю управлять функциональностью. Спасибо.
 

А зацикливать инит() и не нужно. Достаточно в его конце сделать эмуляцию тика. Тогда после выхода из инита будет сразу же запущен старт(). Проверено.

И даже более того. Можно сделать тоже самое и перед выходом из функции старт(), эффект будет тем же! Но правда он не гарантирован. Иногда срабатывает, иногда нет.

 

Видимо это зависит от количества имеющихся сообщений в очереди. Нам нужно ведь чтобы наше сообщение было обработано уже после того как start() завершит свою работу, в противном случае оно будет проигнорировано. Поэтому можно попробовать искусственно загрузить очередь, например так:

start()
{
  ....

  for (int i=0; i<5; i++)
    PostMessageA(Handle,MT4InternalMsg, 2, 1);
  
  return(0);
}

Но это конечно не очень рациональный путь, лишняя нагрузка системы. Тем более что всё-равно срабатывает не всегда.

 
Meat:

А зацикливать инит() и не нужно. Достаточно в его конце сделать эмуляцию тика. Тогда после выхода из инита будет сразу же запущен старт(). Проверено.

И даже более того. Можно сделать тоже самое и перед выходом из функции старт(), эффект будет тем же! Но правда он не гарантирован. Иногда срабатывает, иногда нет.

Скорее всего непроверено. У меня это никогда не работало. Между окончанием функции инит и началом функции старт проходит слишком много времени. Тик впустую.

Сделал по-другому. В ините запускаю скрипт, который "тикает" пока не запустится старт. Старт запустился - сообщает скрипту, чтобы завершился.

 
Zhunko:

Скорее всего непроверено. У меня это никогда не работало. Между окончанием функции инит и началом функции старт проходит слишком много времени. Тик впустую.

Сделал по-другому. В ините запускаю скрипт, который "тикает" пока не запустится старт. Старт запустился - сообщает скрипту, чтобы завершился.

Если бы это было НЕпроверено, то я бы и не стал говорить "проверено". А раз говорю, значит у меня работает, причём 100%. Не знаю, почему у вас не работает. И не совсем понятно, что вы имеете ввиду, говоря "между окончанием функции инит и началом функции старт проходит слишком много времени". Нас ведь интересует вовсе не это время. Нас интересует время между посылом сообщения PostMessage (эмуляция тика) и временем окончания "инита". И это время достаточно короткое, в результате чего PostMessage обрабатывается уже при завершённом "ините", что в свою очередь инициирует запуск функции "старт". Но это опять же я сужу по тому, как оно работает у меня. Кстати интересно было бы услышать ещё отзывы от людей по данному вопросу, работает у них данная фишка или нет.

И вот ещё непонятно, как это вы умудряетесь запустить "старт" при незавершённом "ините"? Первый раз такое слышу. Разве функции советника могут работать параллельно (асинхронно)?

 
marketeer:
Из вопроса не совсем ясно, о каких графических элементах речь - если об объектах на чартах, то ничего страшного, а если нужно работать с контролами и используется dll, то имеет смысл реализовать семафор, поскольку МТ4 нереентерабелен в плане вызовов функции start (и цитата из учебника, приведенная MaxZ, не совсем верна). Подробности можно посмотреть здесь - Проблема: цикл обработки сообщений Windows и сброс локального контекста в start.

Я всех тонкостей конечно же не знаю, но вот так тоже писать нельзя:

Grein:

И забирать котировки самому через функцию, ок! А не получится там переполнения какого-нибудь в стеке или очереди много потоковости процессов? Ведь функция Старт() отрабатывается на каждом тике, и получается что зациклившись в "тике" мы не будем возвращать значение возврата (return) функции, а вызов функции будет происходить каждый тик, отсюда возможное переполнение указателей стека и зависание препроцессора!? Ну по аналогии с ассемблером, пуш и поп команды, сами знаете что там шутки плохи!

:))))

А Ваш пост прям удивил и возмутил!! "Вот и приехали", называется...

 
Meat:

Если бы это было НЕпроверено, то я бы и не стал говорить "проверено". А раз говорю, значит у меня работает, причём 100%. Не знаю, почему у вас не работает. И не совсем понятно, что вы имеете ввиду, говоря "между окончанием функции инит и началом функции старт проходит слишком много времени". Нас ведь интересует вовсе не это время. Нас интересует время между посылом сообщения PostMessage (эмуляция тика) и временем окончания "инита". И это время достаточно короткое, в результате чего PostMessage обрабатывается уже при завершённом "ините", что в свою очередь инициирует запуск функции "старт". Но это опять же я сужу по тому, как оно работает у меня. Кстати интересно было бы услышать ещё отзывы от людей по данному вопросу, работает у них данная фишка или нет.

И вот ещё непонятно, как это вы умудряетесь запустить "старт" при незавершённом "ините"? Первый раз такое слышу. Разве функции советника могут работать параллельно (асинхронно)?


1. Запущен инит.

2. Запущен скрипт из инита.

3. Инит завершён.

4. Скрипт тикает и ждёт запуска старта.

5. Старт запущен.

6. Старт завершает скрипт.