Скачать MetaTrader 5

Помогите разобраться с GlobalAddAtom

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114299
Forex Trader  
Нашел в одной из тем ответ:
" 141 RickD 08.06.2006 16:50
Попробуй через GlobalAddAtom.

1) Импортируешь GlobalAddAtom.
2) Пишешь все данные в строку через разделитель.
3) Вызываешь GlobalAddAtom и получаешь значение атома.
4) Через SendMessage отсылаешь значение, поместив его в wParam.
5) По получении сообщения удаляешь атом.

"
Я не силен в MQL4, подскажите, как правильно задать все параметры на конкретном примере.
В целом, мне необходимо отправить в другую программу сформированный в индикаторе файл, дождаться его обработки, вернуть полученный результат в индикатор, и продолжить его работу. Я пытался это делеть записывая файл из индикатора на диск, и тормозя дальнейшую работу индикатора через Sleep до тех пор, пока внешняя программа не обработает этот файл и не запишетего результат на диск, далее я считывал данные с диска в индикатор. Получается все очень медленно, много времени тратится на записи на диск, а торможение индикатора сильно замедляет обработку результатов в другой программе.
Как сделать все более корректно?
Forex Trader
114299
Forex Trader  
ну можно предложить примерно следующую схему обмена через memory mapped file (MMF)...

при инициализации, индикатор делает:
hDataReadyEvent := CreateEvent(nil, false, false, DataReadyEventName);
hDataProcessedEvent := CreateEvent(nil, false, false, DataProcessedEventName);

тоже самое делает внешняя программа при инициализации.

при передачи данных, индикатор делает:

// создаем MMF
hMMF := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, sizeof(integer) + DataSize, MMFName);
// проецируем его в адресное пространство процесса
ptr := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0);
// сохраняем в буфере размер данных (DataSize типа integer)
move(DataSize, ptr^, sizeof(integer));
// копируем сами данные (Data типа pointer, он например может передаваться из МТ в функцию DLL как параметр)
move(Data^, pointer(dword(ptr) + sizeof(integer))^, DataSize);
// сигнализируем о том, что MMF сформирован
SetEvent(hDataReadyEvent);
// ждем обработки данных внешней программой
WaitForSingleObject(hDataProcessedEvent, INFINITE);
// удаляем MMF
UnmapViewOfFile(ptr);
CloseHandle(hMMF);

внешняя программа делает:

// ждем формирования MMF
WaitForSingleObject(hDataReadyEvent, INFINITE);
// открываем MMF
hMMF := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, MMFName);
// проецируем его в адресное пространство процесса
ptr := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0);
// получаем размер данных (DataSize типа integer)
move(ptr^, DataSize, sizeof(integer));
// формируем указатель на сами данные (Data типа pointer)
Data := pointer(dword(ptr) + sizeof(integer));
// обрабатываем данные
...
// закрываем MMF
UnmapViewOfFile(ptr);
CloseHandle(hMMF);
// сигнализируем о завершении обработки
SetEvent(hDataProcessedEvent);

p.s. все это для передачи в одну сторону, возврат результатов обратно делается аналогично.
p.p.s. все это очень упрощенно, детально за 5 мин. не объяснишь, могу только посоветовать литературу для изучения ;)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий