Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Доброго времени суток!
Пишу простую длл для работы с MQL4. Язык - Delphi.
Принцип работы DLL следующий:
Есть 4 функции MyDLLStart, DataSend, DataGet, Finish.
Скрипт должен вызвать функцию MyDLLStart, чтобы в показть форму, далее в бесконечном цикле вызывается DataSend и DataGet. DataSend отправляет некоторые данные в DLL, а DataGet получает (в виде числа Double).
Так вот, при запуске скрипта окно просто виснет, т.к. не вызывается Application.ProcessMessages. Но если зациклить эту функцию в MyDLLStart, то окно работает нормально. Но. Скрипт не выполняется дальше MyDLLStart, т.к. ждёт её завершения.
Потому вопрос. Кто писал подобное, как синхронизовать форму в DLL, чтоб и ProcessMessages вызывать и скрипт не останавливать?
пример вызывающего скрипта:
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
#import "Project1.dll"
void MyDLLStart();
void DataSend(string cation, double a, double b, double c, double d);
double DataGet();
void Finish();
#import
int start()
{
double X = 0;
//----
// ЭТО ЗАПУСК ДЛЛ
MyDLLStart();
// Запущено!
// далее цикл
while (! IsStopped())
{
// ...
// где-нить здесь
// функцией DataSend передаем данные в DLL
X = DataGet(); // получаем данные
//
// ... тут проверяем полученные данные и
// выполняем какой-нить код
//
Sleep(100);
}
return(0);
}
код проэкта Delphi:
library Project1;
uses
SysUtils,
Classes,
Windows,
ActiveX,
Forms,
frm in 'frm.pas' {frmMain};
procedure DataSend(Title: PChar; a, b, c, d: Double); stdcall;
begin
frmMain.Caption := Title;
with frmMain do
begin
lbBuy1.Caption := FloatToStr(a);
lbBuy2.Caption := FloatToStr(b);
lbShell1.Caption := FloatToStr(c);
lbShell2.Caption := FloatToStr(d);
end;
end;
function DataGet: double; stdcall;
begin
result := GlobalResult; // GlobalResult расчитывается в frm.pas
end;
procedure MyDLLStart; stdcall;
begin
frmMain.Show;
// если тут зациклить Application.ProcessMessages
// то окно не виснет, но и не дает скрипту продолжить работу
end;
procedure Finish;
begin
frmMain.Free;
CoUninitialize();
end;
exports
MyDLLStart, Finish, DataSend, DataGet;
begin
CoInitialize(nil);
frmMain := TfrmMain.Create(nil);
end.
Заранее спасибо!