gpt4 book ai didi

swift - 在不阻塞主线程的情况下连续运行线程

转载 作者:可可西里 更新时间:2023-11-01 01:25:37 26 4
gpt4 key购买 nike

我写了一段代码,我需要不断地运行它。最初我使用 RunLoop.current.run()。它工作正常。问题是它阻塞了主线程。如何在不阻塞的情况下连续在后台运行它。

基本类结构:

class Keylogger
{
func start()
{
let observer = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())

/* Connected and Disconnected Call Backs */
IOHIDManagerRegisterDeviceMatchingCallback(manager, Handle_DeviceMatchingCallback, observer)

IOHIDManagerRegisterDeviceRemovalCallback(manager, Handle_DeviceRemovalCallback, observer)
/* Input value Call Backs */
IOHIDManagerRegisterInputValueCallback(manager, Handle_IOHIDInputValueCallback, observer);
/* schedule */
IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetMain(), CFRunLoopMode.defaultMode.rawValue)
print("Started")
}
}

在 main.swift 中

var logger = Keylogger()
logger.start()
RunLoop.current.run()
// Whatever written below this will not be executed obviously

我之前用过DispatchQueue做后台任务(只是一段代码),但是如何连续执行呢?

我试过了:

var d = Keylogger()
var ff = {
d.start()
}

var f = DispatchQueue(label: "Keylogger", qos: .userInteractive, attributes: .concurrent)
f.async(execute: ff)



while true
{}

但是 Keyloggerstart() 永远不会执行。

我想到了创建可执行文件并通过 NSTask 运行可执行文件。除了这个还有什么办法吗?

最佳答案

我认为您没有理解 RunLoop.current.run() 的用途。

您的代码仅在您的程序运行时才有效。不断。

您的键盘记录器代码在另一个线程上运行。因此,要使该线程保持事件状态,主线程必须处于事件状态。这就是 RunLoop.current.run() 的原因。

因此,尝试使用回调(就像键盘记录器正在使用的那样)并将其安排在另一个线程上。或者,做任何你想做的事,然后将 RunLoop.current.run() 放在代码的最后。

关于swift - 在不阻塞主线程的情况下连续运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com