Можно ли использовать CFRunLoopSource в QThreads? - PullRequest
0 голосов
/ 07 марта 2020

Я пишу приложение 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 обрабатываются должным образом, но также срабатывает событие?

...