Ну если на то пошло, раз ты занимаешься активным пересылом данных между приложениями да при помощи длл то тестировать не будешь в тестере и на чемпионат этот советник не попадет, так что делай его смело зацикленным а новые котировки refreshrate() получай, тогда peekmessage самый раз. Да и к стати идентификатор нити тоже не изменен, просто механизм функционирования экспера видать таков что создается поток в котором исполняется функция старт и как она отработала поток удаляется и так на каждом тике похоже.
Jhonny: Ну если на то пошло, раз ты занимаешься активным пересылом данных между приложениями да при помощи длл то тестировать не будешь в тестере и на чемпионат этот советник не попадет, так что делай его смело зацикленным а новые котировки refreshrate() получай, тогда peekmessage самый раз
Ну да, такие вещи мне интересны.
Потому есть вопроссы. Начнем от печки. Берем ваш скрипт - получатель сообщений и модифицируем его для получения сообщений функцией PeekMessageA().
PeekMessage() в отличие от GetMessage() содержит один дополниельный входной параметр- UINT wRemoveMsg
определенный в winuser.h как
#define PM_NOREMOVE 0x0000
#define PM_REMOVE 0x0001
#define PM_NOYIELD 0x0002
т.е изменить Get на Peek, добавить один интовый параметр в сигнатуру при объявлении, и отправить еще один, проидефайненый выше параметр, при вызове- вот как бы все изменения, наверное, чтобы выполнить ну же самую работу, что выполняли выложенные Вами скрипты до внесенных мною изменений ?
В общем, этот скрипт- получатель после модификации под PeekMessage() у меня не выдает алертов о приходе сообщений И причины не понятны, к сожалению.
Так в том то и прикол что эти функции разные, и для того чтоб работало нужно сделать как в в ссылке которую я привел пару постов выше
по идее нужно написать както так
while(!IsStopped()){while(!PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)){// функция для работы пока нет сообщений
if(IsStopped()) exit;
}if(!GetMessage(&m_msgCur, NULL, NULL, NULL))break;
// код обрабатывающий сообщения
}
Jhonny, как проверю, чувствую, еще вопросы будутт)(
Какие функции разные? PeekMessage() и GetMessage()? Конечно. Я же не только названия меняю в предложенном тобой пару постов выше коде Но судя по этому куску
ты имел ввиду отличие не только в сигнатуре этих функций. Действительно, зачем был бы нужет GetMessage() и проверка условия if после того как отработал
Jhonny писал (а)>>
Я так и не понял, получилось или нужно пример писать?
Женя, пример не нужен.
Я кажется уж разобрался с ообщениями и все хорошо.
Только очень не понятен один момент: у меня по приему сообщения зацикленным скриптом, в котором данные обновляются через Refreshrates() открывается ордер и высвечивается окошко с алертом.
То, что иногда ордер не открывается при запущенном сприпте- это еще половина беды.
Удивительно то, что после такого сбоя с неоткрытым ордером и закрытии метатрейдера при новом запуске терминала может появитсься ордер!
Время открытия совпадает с временем запуска метатрейдера во 2-ой раз! Окошко с алертом при этом не появляется.
То просишь - не работает, то не просишь- неконтролируемо открывается ордер. Но если первый случай- результат неправильно работающей программы- скрипта, то второй случай резульльтат чего???????????????????????????????
Даже если в системном ядре или еще где-то там осталось сообщение, то принимать то его некому- скрипт не запущен!
Нужно аккуратно работать: не забывать удалять ядерные объекты))
Т.е. объекты ядра виндовс, а то крышка: именованный и неудаленный объект, например, мутекс, может заставить верить в барабашку) до перезагрузки ос!
Прочитал несколько раз тему от корку до корки. Но ясность так и не появилась. Начальное образование в программировании у меня имеется, но в основном простенькие прикладные программы (с ядром винды не связывался).
Сейчас имеется задача - передавать информацию из одного МТ в другой МТ. Через файлы я это осуществил. Но это мне не очень нравится; в секунду минимум 2 десятка операций копирования и перезаписи получается. Хочу организовать передачу через оперативку или каким-либо другим безфайловым путем.
Огромная просьба - подскажите еще разок каким лучше путем пойти. если можно - скиньте ссылочки, вводящие в суть предложенного варианта.
Между приложениями можно связать например через файлы-проекции (См. CreateFileMapping) в память. С помощью этой функции можно спроецировать область общей памяти на разные процессы. Однако без написания несложной dll не обойтись.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Ну да, такие вещи мне интересны.
Потому есть вопроссы. Начнем от печки. Берем ваш скрипт - получатель сообщений и модифицируем его для получения сообщений функцией PeekMessageA().
PeekMessage() в отличие от GetMessage() содержит один дополниельный входной параметр- UINT wRemoveMsg
определенный в winuser.h как
#define PM_NOREMOVE 0x0000
#define PM_REMOVE 0x0001
#define PM_NOYIELD 0x0002
т.е изменить Get на Peek, добавить один интовый параметр в сигнатуру при объявлении, и отправить еще один, проидефайненый выше параметр, при вызове- вот как бы все изменения, наверное, чтобы выполнить ну же самую работу, что выполняли выложенные Вами скрипты до внесенных мною изменений ?
В общем, этот скрипт- получатель после модификации под PeekMessage() у меня не выдает алертов о приходе сообщений И причины не понятны, к сожалению.
//+------------------------------------------------------------------+
//| test.mq4 |
//| Jhonny |
//| jhonnyfx@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Jhonny"
#property link "jhonnyfx@mail.ru"
#define WM_USER 0x0400
#define PM_NOREMOVE 0x0000
#define PM_REMOVE 0x0001
#define PM_NOYIELD 0x0002
#import "kernel32.dll"
int GetCurrentThreadId();
#import "user32.dll"
bool PeekMessageA( int& lpMsg[7], // address of structure with message
int hWnd, // handle of window
int wMsgFilterMin, // first message
int wMsgFilterMax, // last message
int remflg );
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
int A[7];
Alert("CurrentThreadId = " + GetCurrentThreadId());
while(!IsStopped() && PeekMessageA(A,0,WM_USER,WM_USER,PM_REMOVE))
{
Alert("Получено сообщение!");
}
return(0);
}
//+------------------------------------------------------------------+
Так в том то и прикол что эти функции разные, и для того чтоб работало нужно сделать как в в ссылке которую я привел пару постов выше
по идее нужно написать както так
Какие функции разные? PeekMessage() и GetMessage()? Конечно. Я же не только названия меняю в предложенном тобой пару постов выше коде Но судя по этому куску
while (!IsStopped())
{
while (!PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// функция для работы пока нет сообщений if(IsStopped()) exit;
}
if (!GetMessage(&m_msgCur, NULL, NULL, NULL)) break;
// код обрабатывающий сообщения }
ты имел ввиду отличие не только в сигнатуре этих функций. Действительно, зачем был бы нужет GetMessage() и проверка условия if после того как отработал
while (!PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// функция для работы пока нет сообщений if(IsStopped()) exit;
}
если бы он (GetMessage() ) работал бы аналогично Peek()? Собщение тогда, по идее, было бы уже получено ведь!
И, как понимаю, не удалено из очереди, а значит GetMessage(&m_msgCur, NULL, NULL, NULL) получил бы то,
что до него только что получил Peek() и break вообще бы никогда не выполнился бы.
Я так и не понял, получилось или нужно пример писать?
Женя, пример не нужен.
Я кажется уж разобрался с ообщениями и все хорошо.
Только очень не понятен один момент: у меня по приему сообщения зацикленным скриптом, в котором данные обновляются через Refreshrates() открывается ордер и высвечивается окошко с алертом.
То, что иногда ордер не открывается при запущенном сприпте- это еще половина беды.
Удивительно то, что после такого сбоя с неоткрытым ордером и закрытии метатрейдера при новом запуске терминала может появитсься ордер!
Время открытия совпадает с временем запуска метатрейдера во 2-ой раз! Окошко с алертом при этом не появляется.
То просишь - не работает, то не просишь- неконтролируемо открывается ордер. Но если первый случай- результат неправильно работающей программы- скрипта, то второй случай резульльтат чего???????????????????????????????
Даже если в системном ядре или еще где-то там осталось сообщение, то принимать то его некому- скрипт не запущен!
Добрый день, уважаемые!
Прочитал несколько раз тему от корку до корки. Но ясность так и не появилась. Начальное образование в программировании у меня имеется, но в основном простенькие прикладные программы (с ядром винды не связывался).
Сейчас имеется задача - передавать информацию из одного МТ в другой МТ. Через файлы я это осуществил. Но это мне не очень нравится; в секунду минимум 2 десятка операций копирования и перезаписи получается. Хочу организовать передачу через оперативку или каким-либо другим безфайловым путем.
Огромная просьба - подскажите еще разок каким лучше путем пойти. если можно - скиньте ссылочки, вводящие в суть предложенного варианта.
Спасибо.
Между приложениями можно связать например через файлы-проекции (См. CreateFileMapping) в память. С помощью этой функции можно спроецировать область общей памяти на разные процессы. Однако без написания несложной dll не обойтись.
Что бы заработали скрипты Jhonny надо :
1) Поставить галочки в свойствах скриптов "Разрешить импорт DLL" и "Разрешить сигналы"
2) После запуска "скрипта-приёмника", скопировать номер с генерированного потока, который он пишет в алерте
и вставить этот номер в свойствах "скрипта-отправителя" в поле ввода значения переменной "threadId"