2013-03-29 2 views
-1

나는 자신의 목적을 위해 메인 쓰레드를 독점하는 프로그램을 만들고있다. 조건 적으로이 프로그램은 Cocoa 창을 생성해야 할 수도 있습니다. 그러나 주 스레드가 이벤트 루프 (또는 최소한 NSRunLoop)를 실행하지 않기 때문에 보조 스레드에서 NSRunLoop으로 UI를 실행할 수 있는지 궁금합니다.UI를 보조 스레드에서 실행할 수 있습니까?

나는 Windows에서 동일한 기능을 사용할 수 있지만 Mac OS에서 작동하는지 여부는 문서에서 분명하지 않으며 가능한 경우 전혀 수행하지도 않습니다.

주 스레드가 NSApplicationMain을 호출해야합니다.

+1

보조 스레드에서 GUI를 실행하고 주 스레드에서 작업하는 것이 다른 점은 무엇입니까? –

+0

기본 응용 프로그램 설계 원칙 (모든 ** 플랫폼에서)으로 인해 주위를 망칠 필요가 있다고 느낄 때 전체 디자인에 결함이 있으며 강력한 드로잉 보드로 돌아갈 필요가 있음을 나타내는 강력한 표시입니다. – Jay

+0

@Jay, 왜 GUI가 _fundamentally_ 메인 스레드에서 실행 해야하는지 설명해주십시오. 이것은 Windows에서 완벽하게 합법적입니다. WPF 및 여러 앱 도메인을 사용하면 여러 스레드에서 수행 할 수도 있습니다. Java에서 Swing은 메인 스레드와 구별되는 자체 스레드를 가지고 있습니다. 여기에 근본적인 결함이 있다면, 코코아는 항상 'NSApplicationMain'이 호출 된 스레드가 아닌 첫 번째 스레드를 찾거나 첫 번째 실행 루프가 만들어 졌다고합니다. – zneak

답변

2

아니요. UI는 주 스레드에 있어야합니다. NSOperation 또는 다른 방법을 사용하여 백그라운드에서 작업을 수행하고 UI를 업데이트 할 수 있습니다. performSelectorOnMainThread UI는 응용 프로그램 실행 루프에 의존합니다.

+0

나는 응용 프로그램 실행 루프에 의존한다는 것을 알고 있지만, 왜 이것이 문제가되어야하는지 알지 못합니다. 모든 스레드에서만 NSRunLoop을 만들 수 있습니다. – zneak

+0

@zneak : 내 머리 꼭대기에서 Apple Events가 주 스레드의 실행 루프로 전달된다는 사실이 있습니다. Finder에서 응용 프로그램의 문서를 열고 Dock을 통해 응용 프로그램을 활성화하고 이미 열려있는 상태에서 사용자가 응용 프로그램을 실행할 때 응용 프로그램을 다시 열면 Apple 이벤트가 모두 제공됩니다. 스레드이므로 AppKit의 표준 핸들러도 기본 스레드에 등록해야합니다. –

관련 문제