Мне нужен лучший способ вызывать события, чем SetTimer API в user32.dll.
Вы успешно использовали другие API таймера?Вы знаете другой способ вызывать события или вызывать функцию асинхронно в Excel?
Что я имею в виду под «лучше»?Мне нужно что-то, что может вытолкнуть сообщения из внутренней очереди, асинхронно.Проблема в том, что элементы помещаются в очередь внешним источником данных (рыночные данные Reuters), который вызывает события «Обновление данных» с сообщениями в диапазоне WM_Application;SetTimer работает, отправляя сообщения WM_Timer, семикратное слабое место в Windows Messaging, и мой процесс «Pop» никогда не получает шансов на запуск, даже при относительно небольшом трафике.
Если у вас есть предложения по улучшению архитектуры,не стесняйтесь предлагать их: но событие обновления входящих данных ОБЯЗАТЕЛЬНО ДОЛЖНО перейти в «приемник» события, как можно быстрее - Excel будет аварийно завершать работу, если возникает слишком много событий (или обратных вызовов), в то время как какой-то длинный, медленный процесс обрабатывает последнеесобытие, и тот, что до этого.Моя очередь имеет конечный размер, потому что в приложении всего несколько сотен акций: входящее обновление данных может либо просмотреть и обновить существующий элемент, если это обновленная цена для акции, которая уже находится в очереди, или выдвинуть новую акциютикер и цена в очередь.Таким образом, данные о ценах никогда не отбрасываются, потому что мы заняты, а четкое кодирование для функций push и peek означает, что приемник событий достаточно быстр, чтобы обеспечить стабильность Excel.
Но я остался в поискелучший способ вытаскивать элементы из очереди.
К сожалению, все другие API таймеров, которые я пробовал, не работают в VBA: они приводят к аварийному завершению приложения или заморозке выполнения кода.Вот список (гиперссылки ведут к документации MSDN):
- CreateTimerQueueTimer Lib "Kernel32.dll"
- CreateWaitableTimer Lib "kernel32"
- TimeSetEvent Lib "winmm.dll"
Я подозреваю, что проблемы с этими функциями не имеют ничего общего с плохим синтаксисом с моей стороны: я не знаюМодель потоков Windows достаточно хороша, чтобы сказать, что на самом деле происходит, когда они перезванивают, но в документации по одному из них говорится, что «Эта функция обратного вызова не должна вызывать функцию TerminateThread», и я понимаю, что VBA не может «утопить» возникшее событиес этим конкретным API таймера.
Считайте, что я знаю, что я знаю правильные вызовы API для Kill или удаления этих таймеров и связанных с ними очередей: пространство ограничено, а таймер Waitable использует отдельные Create-, Set-, Cancel- и вызовы API CloseHandle.И все функции TimerProc имеют немного разные подписи.
Вот стандартный вызов функции SetTimer:
lngTimerID = SetTimer (hWndXL, VBA.ObjPtr (Me), lngInterval, AddressOf TimerProc)
Я не буду утомлять васобъявление функции TimerProc и отступление от делегирования: если вы можете ответить на этот вопрос, вы уже видели все соответствующие примеры кода.
Я с нетерпением жду ваших ответов: у меня есть работающее приложение и осторожное кодированиеи сегрегация означает, что внутренняя задержка данных является приемлемой.Но я хотел бы думать, что я мог бы добиться большего успеха, даже если бы я ограничился выпуском отдельной книги Excel.