Вопрос, поднятый пользователем, касается использования компонента TOmniEventMonitor в фоновых потоках в приложении Delphi XE4. Проблема заключается в том, что при работе TOmniEventMonitor в главном потоке всё функционирует корректно, но как только код переносится в фоновый поток, компонент перестаёт получать сообщения. В контексте приведены два примера кода, которые демонстрируют эту проблему.
Подтвержденный ответ
Из контекста следует, что проблема связана с отсутствием обработчика сообщений для TOmniEventMonitor в фоновом потоке. Для корректной работы TOmniEventMonitor необходимо, чтобы был активен цикл обработки сообщений (message loop). В фоновом потоке такой цикл отсутствует, поэтому сообщения для TOmniEventMonitor не обрабатываются.
Для решения проблемы можно создать отдельный цикл обработки сообщений внутри фонового потока, как показано в примере кода:
procedure TMyThread.Execute;
var
Message: TMsg;
begin
FreeOnTerminate := True;
fOmniEventMonitor := TOmniEventMonitor.Create(nil);
fOmniEventMonitor.OnTaskMessage := HandleOmniTaskMessage;
fOmniTaskControl := fOmniEventMonitor.Monitor(CreateTask(OmniTaskProcedure_OneShotTimer)).Run();
try
while not Terminated do
begin
if MsgWaitForMultipleObjects(0, nil^, False, 1000, QS_ALLINPUT) = WAIT_OBJECT_0 then
begin
while PeekMessage(Message, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Message);
DispatchMessage(Message);
end;
end;
end;
finally
fOmniTaskControl := nil;
fOmniEventMonitor.Free;
end;
end;
Также важно зарегистрировать окно сообщений TOmniEventMonitor в списке ожидаемых объектов задачи, чтобы сообщения обрабатывались:
function TTestLauncherTask.Initialize() : boolean;
begin
result := inherited Initialize();
if result then begin
fOmniTaskMonitorTester := TOmniEventMonitorTester.Create('background');
// Регистрация окна сообщений TOmniEventMonitor в списке ожидаемых объектов задачи
Task.RegisterWaitObject(fOmniTaskMonitorTester.fOmniEventMonitor.MessageWindow, DoNothingProc);
end;
end;
Рекомендации
Убедитесь, что в фоновом потоке присутствует цикл обработки сообщений для TOmniEventMonitor.
Регистрируйте окно сообщений TOmniEventMonitor в списке ожидаемых объектов задачи.
Перед использованием TOmniEventMonitor в фоновых потоках внимательно изучите документацию и рекомендации по работе с многопоточностью в Delphi.
Заключение
При правильном использовании TOmniEventMonitor в фоновых потоках можно добиться корректной обработки сообщений, следуя рекомендациям, приведенным выше.
Проблема заключается в том, что для корректной работы компонента `TOmniEventMonitor` в фоновом потоке необходимо обеспечить наличие цикла обработки сообщений, который отсутствует в фоновых потоках по умолчанию.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.