2011-01-20 2 views
0

Предположим, у меня есть несколько шагов, например, во время установки программного обеспечения.Любая альтернатива обратным вызовам для программирования пользовательского интерфейса?

Каждый шаг отображает текстовое поле и ждет, пока пользователь нажмет кнопку «Далее».

Стандартный способ сделать это, чтобы иметь обратный вызов, как это:

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

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

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

Этот метод делает код совершенно нечитаемым, когда есть много шагов, как вы должны разделяй вы обрабатываете в каждый последующий callback (не говоря уже о сохранении контекста от одного к другому).

Что было бы проще для чтения? В идеале этот процесс должен читаться как этого:

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

Проблема с этим состоит в том, что вы не можете остановить поток пользовательского интерфейса. Любая идея или работа вокруг были бы очень оценены.

PS: это как работать в C или Objective C

ОТВЕТ

Так после того, как обнаружили Сопрограммы благодаря Мартину B я нашел эту страницу: https://stackoverflow.com/posts/4746722/edit и в конечном итоге с помощью этого кода:

define coRoutineBegin static int state=0; switch(state) { case 0: 
define yield do { state=__LINE__; return; 
        case __LINE__:; } while (0); 

define coRoutineEnd } 

void process() 
{ 
    coRoutineBegin 

    Dialog1() 
    yield 
    Dialog2() 
    yield 
    Dialog3() 
    yield 
    Dialog4() 
     yield 

    coRoutineEnd 
} 
+0

Ненавижу C за отсутствие функциональных конструкций. Это может быть прекрасно выражено в функциональных языках (например.javascript) используя * продолжение *. –

ответ

2

Вы ищете coroutines, которые обеспечивают именно концепцию, которую вы ищете: сеющий управления из функции без выхода Это. В сущности, ваш код будет выглядеть следующим образом:

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

К сожалению, сопрограммы не поддерживаются изначально на C или Objective C и трудно реализовать в общем, не прибегая к уродливым хаки. Тем не менее, вы можете принять концепцию как отправную точку для конкретной ситуации для вашей ситуации.

+1

На самом деле, при разработке диалогов путь «обратных вызовов» называется ** продолжением стиля передачи ** (google this term). Корутины обычно реализуются с использованием CPS. Один хороший способ - передать обратный вызов, описывающий, что делать дальше (* продолжение *) в подпрограммах диалога. Проблема в том, что C не имеет функциональных конструкций, чтобы сделать это чисто. –

+0

Это выглядит очень интересно. Раньше я никогда не слышал о сопрограммах. – CodeFlakes

0

Я не совсем понимаю проблему. Почему не отображается модальный диалог? Модальные диалоговые окна блокируют до тех пор, пока они будут уволены так что ваша логика будет выглядеть так:

Dialog1() 
Dialog2() 
Dialog3() 

Другим решением является, чтобы ваши диалоги или обратные вызовы или независимо от отправки события. Затем вы связываетесь с этими событиями. Ваша главная логика будет выглядеть так (извините, я не знаю, как сделать примеры GUI в C/Objective-C, поэтому я буду использовать Tcl/Tk, поскольку его весьма читаемым):

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

В Функции showDialogX будут делать все, что им нужно, а затем создать событие, в котором говорится: «Я готов, готов к следующему шагу».

Смежные вопросы