Я пишу приложение macOS / Qt, которое должно использовать событие Quartz. Для того чтобы все было как можно быстрее, что важно при прослушивании событий, я хочу, чтобы он работал в своем собственном потоке. Обычно нажатие события запускается так (минус проверка на наличие ошибок):
CFMachPortRef eventTapMachPortRef = CGEventTapCreate(...)
CFRunLoopSourceRef runLoopSourceRef = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTapMachPortRef, 0);
CFRunLoopAddSource(runLoopSourceRef);
, и если это выполняется в потоке, запущенном с помощью одного из собственных методов Apple, таких как NSThread, он работает нормально при условии нативный прогон l oop запускается с использованием CFRunLoopRun()
или [[NSRunLoop currentRunLoop] run]
.
Однако, поскольку это приложение Qt, я бы хотел использовать QThread
, чтобы воспользоваться преимуществами механизма сигналов / слотов Qt , Но если я создаю событие, используя описанный выше метод в QThread
, оно никогда не срабатывает. Запуск собственного события l oop в QThread
вместо использования метода Qt, такого как QEventLoop().exec()
или QCoreApplication::processEvents()
, не позволяет ему правильно обрабатывать события Qt. Это приводит к другому набору проблем, например, QThread::quit
не работает, чтобы остановить событие потока l oop.
Есть ли способ смешать их вместе, чтобы события QThread
обрабатываются должным образом, но также срабатывает событие?