виснет окно в DLL (Delphi)

 

Доброго времени суток!

Пишу простую длл для работы с 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.


Заранее спасибо!

Причина обращения: