Сделать синхронизацию, Delphi

Денис16 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
03.10.2013

В проекте есть библиотека TRANS2QUIK.dll, при помощи которой происходит обмен данными с QUIK.

Юнит QuikExt является интерфейсом для работы с этой библиотекой.

В main.pas реализована демонстрационная работа с этим интерфейсом: при получении котировок от QUIK робот будет бесконечно торговать одним лотом, выставляя лимитные ордера по текущим ценам - их можно наблюдать в стакане QUIK, они там выделяются жирным шрифтом.

Основная логика работы примерно следующая. Используя функцию Quik.SendASyncTransaction( TransStr ) по API в QUIK отправляется сделка, далее в интерфейс QuikExt приходят асинхронные ивенты от QUIK в 4 функции (ConnectionStatusCallbackClass, TransReplyStatusCallbackClass, OrderStatusCallbackClass, TradeStatusCallbackClass), в которых происходит формирование классов с данными от полученных ивентови добавление их в Queue.List (TThreadList). Далее, после каждого ивента, отправляется PostMessage для обработки обновленного листа в procedure TQuik.WMInsertQueue(var Message: TWMSysCommand), в котором полученные классы отправляются дальше (в цикле пробегая лист) в основное приложение.

Проблема в отсутствии синхронизации: ивенты приходят асинхронно и лочат лист, и процедура обработки листа делает тоже самое. Может прийти несколько ивентов практически одновременно.

Проект прилагается.

Для тестирования работы проекта понадобится программа QUIK-Junior, её версию, настроенную под проект, вышлю позже.

Так же в проекте используется SmartInspect 3.2.3 для логирования (в uses SiAuto) - есть на рутрекере.