Скачать MetaTrader 5

Впорос по "SendMessageA" и ... "адресам переменных" - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Евгений
110
Евгений 2008.05.21 12:22  
Ну если на то пошло, раз ты занимаешься активным пересылом данных между приложениями да при помощи длл то тестировать не будешь в тестере и на чемпионат этот советник не попадет, так что делай его смело зацикленным а новые котировки refreshrate() получай, тогда peekmessage  самый раз. Да и к стати идентификатор нити тоже не изменен, просто механизм функционирования экспера видать таков что создается поток в котором исполняется функция старт и как она отработала поток удаляется и так на каждом тике похоже.
Siarhei
63
Siarhei 2008.05.26 10:51  
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() у меня не выдает алертов о приходе сообщений И причины не понятны, к сожалению.

//+------------------------------------------------------------------+

//|                                                         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);

}

//+------------------------------------------------------------------+

Евгений
110
Евгений 2008.05.26 12:15  

Так в том то и прикол что эти функции разные, и для того чтоб работало нужно сделать как в в ссылке которую я привел пару постов выше

по идее нужно написать както так

while (!IsStopped())
{
    while (!PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) 
    {
        // функция для работы пока нет сообщений
        if(IsStopped()) exit;

    }
    if (!GetMessage(&m_msgCur, NULL, NULL, NULL)) break;
    
    // код обрабатывающий сообщения
}
Siarhei
63
Siarhei 2008.05.26 14:26  
Jhonny, как проверю, чувствую, еще вопросы будутт)(
Какие функции разные? 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  вообще  бы никогда не выполнился бы.

Евгений
110
Евгений 2008.05.26 17:14  
Я так и не понял, получилось или нужно пример писать?
Siarhei
63
Siarhei 2008.07.10 09:14  
Jhonny писал (а) >>
Я так и не понял, получилось или нужно пример писать?

Женя, пример не нужен.

Я кажется уж разобрался с ообщениями и все хорошо.



Только очень не понятен один момент: у меня по приему сообщения  зацикленным скриптом, в котором данные обновляются через Refreshrates() открывается ордер и высвечивается окошко с алертом.

То, что иногда ордер не открывается при запущенном  сприпте-  это еще половина беды.

Удивительно то, что после такого сбоя с неоткрытым ордером и закрытии метатрейдера при новом запуске терминала может появитсься ордер!

Время открытия совпадает с временем запуска метатрейдера во 2-ой раз! Окошко с алертом при этом не появляется.


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

Даже если в системном ядре или еще где-то там осталось сообщение, то принимать то его некому- скрипт не запущен!

Siarhei
63
Siarhei 2008.07.17 14:18  
Нужно аккуратно работать: не забывать удалять ядерные объекты)) Т.е. объекты ядра виндовс, а то крышка: именованный и неудаленный объект, например, мутекс, может заставить верить в барабашку) до перезагрузки ос!
Давид
3
Давид 2009.02.04 07:37  

Добрый день, уважаемые!

Прочитал несколько раз тему от корку до корки. Но ясность так и не появилась. Начальное образование в программировании у меня имеется, но в основном простенькие прикладные программы (с ядром винды не связывался).

Сейчас имеется задача - передавать информацию из одного МТ в другой МТ. Через файлы я это осуществил. Но это мне не очень нравится; в секунду минимум 2 десятка операций копирования и перезаписи получается. Хочу организовать передачу через оперативку или каким-либо другим безфайловым путем.

Огромная просьба - подскажите еще разок каким лучше путем пойти. если можно - скиньте ссылочки, вводящие в суть предложенного варианта.

Спасибо.

void
171
void 2009.02.04 08:43  

Между приложениями можно связать например через файлы-проекции (См. CreateFileMapping) в память. С помощью этой функции можно спроецировать область общей памяти на разные процессы. Однако без написания несложной dll не обойтись.

Aleksandr_
4
Aleksandr_ 2012.04.08 06:30  

Что бы заработали скрипты Jhonny надо :

1) Поставить галочки в свойствах скриптов "Разрешить импорт DLL" и "Разрешить сигналы"

2) После запуска "скрипта-приёмника", скопировать номер с генерированного потока, который он пишет в алерте

и вставить этот номер в свойствах "скрипта-отправителя" в поле ввода значения переменной "threadId"

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий