2017-01-20 9 views
2

コードを書きましたので、それを連続して実行する必要があります。当初私は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で実行することを考えました。それ以外の方法はありませんか?

+0

バックグラウンドキューで無限のタスクを呼び出すタイマーを繰り返し起動することができます。 http://stackoverflow.com/a/29564713/1457385 – shallowThought

+0

まだ回答はありますか? – SkrewEverything

+0

@SkrewEverythingはい – unknownymouse

答えて

2

RunLoop.current.run()の目的を理解していないと思います。

コードは、プログラムの実行中にのみ機能します。常に。

あなたのkeyloggerコードは別のスレッドで実行されています。だから、そのスレッドを生かし続けるためには、メインスレッドがアクティブでなければなりません。それがRunLoop.current.run()の理由です。

(keyloggerが使用しているように)コールバックを使用して、別のスレッドでスケジュールしてみてください。または、コードの最後にRunLoop.current.run()を置きます。

+2

ありがとうございます。 – unknownymouse

関連する問題