2011-01-20 4 views
0

예를 들어 소프트웨어 설치 과정에서와 같이 몇 가지 단계 프로세스가 있다고 가정 해 보겠습니다.UI 프로그래밍 콜백 대신 사용할 수있는 방법은 무엇입니까?

각 단계는 텍스트 상자를 표시하고 사용자가 "다음"버튼을 클릭 할 때까지 기다립니다. 각 연속으로 처리하면 분할에 가지고 많은 단계가있을 때

process 
{ 
    Dialog1() // Will call callback2 when closed 
} 

callback2() 
{ 
    Dialog2() // Will call callback3 when closed 
} 

callbak3() 
{ 
    Dialog3() // Will call callback4 when closed 
} 

이 기술은 코드가 꽤 읽을 수 있습니다 :

을 수행하는 표준 방법은 다음과 같이 콜백을하는 것입니다 콜백 함수 ( 컨텍스트를 저장하는 것은 물론).

읽기 쉬운 방법은 무엇입니까? 이상적으로 프로세스가 다음과 같이 읽어야 :이와

process() 
{ 
    Dialog1() 
    callback1() // stop method until closed 
    Dialog2() 
    callback2() // stop method until closed 
    Dialog3() 
    callback3() // stop method until closed 
} 

문제는 UI 스레드를 중지 할 수 있다는 것입니다. 어떤 아이디어 나 해결 방법도 매우 감사 할 것입니다.

PS :이 같은

답변

그래서이 페이지를 발견했습니다 마틴 B에 발견 된 코 루틴 덕분 가진 후 C 또는 목표 C에서 일하기 : https://stackoverflow.com/posts/4746722/edit을하고이 코드를 사용하여 종료를 :

+0

나는 기능적인 구조를 가지고 있지 않기 때문에 C가 싫다. 이것은 기능적 언어로 완벽하게 표현 될 수 있습니다 (예.자바 스크립트) * continuations *. –

답변

2

당신은 당신이 찾고있는 정확하게 개념을 제공 coroutines, 찾고 : 종료하지 않고 함수에서 항복 제어를 그것. 본질적으로, 당신의 코드는 다음과 같습니다

process() 
{ 
    Dialog1() 
    yield 
    Dialog2() 
    yield 
    Dialog3() 
} 

불행하게도, 코 루틴은 C 또는 목표 C에서 기본적으로 지원하고 추악한 해킹에 의지하지 않고 일반적으로 구현하기 어려운되지 않습니다. 그러나 상황에 맞는 특수 케이스 구조의 시작점으로 개념을 사용할 수 있습니다.

+1

실제로 "콜백"방식으로 대화 상자를 디자인하는 것을 ** 연속성 전달 스타일 ** (이 용어는 google)이라고합니다. 코 루틴은 일반적으로 CPS를 사용하여 구현됩니다. 하나의 좋은 방법은 콜백이 다음에 할 일 (* 계속 *)을 다이얼로그 루틴에 전달하는 것입니다. 문제는 C가 이것을 제대로 수행 할 수있는 기능적인 구조를 가지고 있지 않다는 것입니다. –

+0

매우 흥미로 웠습니다. 전에는 coroutines에 대해 들어 본 적이 없어요. – CodeFlakes

0

저는이 문제를 잘 이해하지 못합니다. 모달 대화 상자가 표시되지 않는 이유는 무엇입니까?

Dialog1() 
Dialog2() 
Dialog3() 

또 다른 해결책은 이벤트를 보낼 무엇이든 대화 상자 또는 콜백 또는을하는 것입니다 : 당신의 논리는 같을 것이다, 그래서 그들이 해산 될 때까지 모달 대화 상자가 차단합니다. 그런 다음 해당 이벤트에 바인딩합니다. 귀하의 주요 논리는 (죄송합니다, 나는 C/오브젝티브 C에 GUI 예제를 수행하는 방법을 모르는, 그래서 난은 Tcl/Tk의 때문에 매우 읽을 사용합니다)과 같을 것이다 :

bind $rootWindow <<Step1>> showDialog1 
bind $rootWindow <<Step2>> showDialog2 
bind $rootWidow <<Step3>> showDialog3 
# kick off the first step 
event generate $rootWindow <<Step1>> 

을 showDialogX 함수는 필요한 작업을 수행 한 다음 "끝났습니다. 다음 단계 준비 완료"라는 이벤트를 생성합니다.

관련 문제