2015-10-19 19 views
0

我創建了一個CGEventTap這樣的:CFRunLoopRunInMode與代碼1退出,因爲如果不添加任何物質

GetCurrentProcess(psn); 

var mask = 1 << kCGEventLeftMouseDown | // CGEventMaskBit(kCGEventLeftMouseDown) 
      1 << kCGEventLeftMouseUp | 
      1 << kCGEventRightMouseDown | 
      1 << kCGEventRightMouseUp | 
      1 << kCGEventOtherMouseDown | 
      1 << kCGEventOtherMouseUp | 
      1 << kCGEventScrollWheel; 

mouseEventTap = CGEventTapCreateForPSN(&psn, kCGHeadInsertEventTap, kCGEventTapOptionDefault, mask, null); 

if (!mouseEventTap.isNull()) { 
     aRLS = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mouseEventTap, 0); 
     CFRelease(mouseEventTap); 

     if (!aRLS.isNull()) { 
      aLoop = CFRunLoopGetCurrent(); 

      CFRunLoopAddSource(aLoop, aRLS, kCFRunLoopCommonModes); 

      CFRelease(aRLS); 
      CFRelease(aLoop); 

      rez = CFRunLoopRunInMode(ostypes.CONST.kCFRunLoopCommonModes, 10, false); // figure out how to make this run indefinitely 
      // rez is 1 :(

     } 

} 

CFRunLoopRun立即退出,而不是持續10秒運行。它說代碼是1,這意味着沒有來源處於該模式。但我清楚地做了CFRunLoopAddSource共同模式選項kCFRunLoopRunFinished. The run loop mode mode has no sources or timers.。任何人都知道最新情況?這是在非主線程。

+1

不應該把runloop代碼放在'do while'中嗎? 我不是專家,但當我與runloops搞砸我來到這樣的東西http://stackoverflow.com/questions/33064115/obj-c-configure-run-loop-for-nsdistributionnotificationcenter – ColdSteel

+0

謝謝@ user3351949是的,我應該對於'CFRunLoopRunInMode',因爲它有一個區間。如果我使用'CFRunLoopRun',我不會無限期地運行。但是我需要'CFRunLoopRunInMode',因爲我需要它在'kCFRunLoopCommonModes'模式下運行,我不認爲我們可以用'CFRunLoopRun'在該模式下無限期地運行,但是如果我們能做到這一點,那將是最好的。但是我沒有這樣的情況,因爲我只是測試循環是否持續了10秒,因爲那是間隔時間,但是它並沒有那麼強大,它仍然以代碼「1」退出,認爲它有沒有來源。 – Noitidart

+1

你是否擁有aLoop,你必須發佈它嗎? – Willeke

回答

1

您無法在kCFRunLoopCommonModes中運行運行循環。這在CFRunLoopRunInMode()的文檔中有明確說明。

kCFRunLoopCommonModes是一個虛擬模式。它基本上是一組其他模式。它只能在向運行循環添加(或刪除)源時使用,以表示「在運行循環以集合中的任何模式運行時監視此源」。但是當你運行一個運行循環時,你必須以特定的實模式運行它,而不是代表一組其他模式的虛擬模式。

我建議,當您在專用線程上工作並且只想監視私有源時,將源添加到自定義模式並在該模式下運行運行循環。自定義模式只是一個具有唯一值的字符串。例如,像「com.yourcompany.yourproject.yourmodespurpose」之類的東西。使用自定義模式可以確保運行循環永遠不會做任何意想不到的事情,比如觸發框架添加的源代碼。

您不得發佈aLoop。沒有「創建」或「複製」名稱的功能不會賦予您所有權。

你需要在你的電話一個循環CFRunLoopRunInMode(),因爲它會從你的源(kCFRunLoopRunHandledSource == 4)每次處理事件時返回或打超時(kCFRunLoopRunTimedOut == 3)。如果它返回其他任何東西,你應該跳出循環。

+0

只是醒了,sooo很高興看到這個謝謝你肯!將馬上測試! :) – Noitidart

+0

非常感謝它現在退出與代碼3超時,我花了一些時間,並更新你爲什麼不退出與代碼4處理其非常有趣。 – Noitidart

+0

Yesss它的作品!我只是要修好我的面具,沒有你的東西,這將無法工作!非常感謝!!!這裏是我的解決方案:https://github.com/Noitidart/MouseControl/blob/3a85e748b6e1725dc019b048c13303c3320597bf/modules/workers/MMSyncWorker.js#L788-L834 – Noitidart