UI编程的回调的替代方法?

时间:2011-01-20 11:48:12

标签: c design-patterns user-interface callback

假设我在软件安装过程中有几个步骤,例如。

每个步骤显示一个文本框,等待用户点击“下一步”按钮。

执行此操作的标准方法是进行如下回调:

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:这是为了在C或Objective C中工作

ANSWER

因此,感谢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 个答案:

答案 0 :(得分:2)

您正在寻找coroutines,它提供了您正在寻找的概念:在不退出的情况下从函数中获得控制权。实质上,您的代码看起来像这样:

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

不幸的是,协同程序本身不受C或Objective C的支持,并且在不诉诸丑陋黑客的情况下很难实现。但是,您可以将概念作为特殊情况构造的起点,以适应您的情况。

答案 1 :(得分:0)

您可以使用互斥锁或类似的概念来打开对话框并在不同的线程中运行。

以下是我认为有效的示例帖子:

Synchronization/wait design for cross-thread event signaling (Obj-C)?

答案 2 :(得分:0)

我不太明白这个问题。为什么不显示模态对话框?模态对话框会被阻止,直到它们被解除,因此您的逻辑看起来像:

Dialog1()
Dialog2()
Dialog3()

另一个解决方案是让您的对话框或回调或任何发送事件。然后绑定到这些事件。你的主要逻辑看起来像这样(抱歉,我不知道如何在C / Objective-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函数会执行他们需要做的任何事情,然后生成一个事件,说“我已经完成,准备好进行下一步”。