c - UI 编程中除了回调还有其他选择吗?

标签 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

回答

因此,在 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
}

最佳答案

您正在寻找coroutines ,它准确地提供了您正在寻找的概念:从函数中产生控制而不退出它。本质上,您的代码将如下所示:

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

不幸的是,C 或 Objective C 本身不支持协程,并且在不诉诸丑陋的 hack 的情况下很难通用地实现。但是,您可以将此概念作为针对您的情况构建特殊案例的起点。

关于c - UI 编程中除了回调还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4746722/

相关文章:

java - AsyncTask 卡住 UI

iphone - 用 opengl ES 为 iphone 制作了一个 2d 游戏。我应该使用 uikit 作为其之上的界面吗?

c - 如何从 "conversion to ‘char’ 中删除警告 ‘int’ 可能会改变它的值”

c - 将 'abstract sockets' 与 AF_UNIX SOCK_DGRAM 结合使用

design-patterns - 用户/角色管理系统的最佳设计?

java - Lwjgl GUI 库

c++ - 子进程收到父进程的 SIGINT

检查文件是否仅包含 < 10 位字符

java - 覆盖字段初始化

c - 如何从使用 gtk 回调调用的函数返回值?