Любая альтернатива обратным вызовам для программирования пользовательского интерфейса? - PullRequest
0 голосов
/ 20 января 2011

Допустим, у меня есть несколько этапов, например, во время установки программного обеспечения.

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

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

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
}

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

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

ОТВЕТ

Итак, после обнаружениясопрограммы благодаря Martin 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
}

Ответы [ 3 ]

2 голосов
/ 20 января 2011

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

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

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

0 голосов
/ 20 января 2011

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

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 будут делать все, что им нужно, затем генерировать событие, говорящее «Я готов, готов к следующему шагу».

0 голосов
/ 20 января 2011

Вы можете использовать мьютекс или аналогичную концепцию, когда диалог открывается и запускается в другом потоке.

Вот пост с примером, который я считаю верным:

Синхронизация / ожидание для сигнализации о событиях между потоками (Obj-C)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...