Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну да, такие вещи мне интересны.
Потому есть вопроссы. Начнем от печки. Берем ваш скрипт - получатель сообщений и модифицируем его для получения сообщений функцией 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"