在库和GUI之间传递事件的有效方法是什么?

时间:2018-05-18 09:23:12

标签: c events rust

我正在编写一个异步执行IO的库。不同类型的GUI将使用此库来创建相同的应用程序,但适用于不同的平台。该库生成GUI要使用的事件。该库是用Rust编写的,但我设想它有一个C接口,GUI将提供一些内存和调用初始化函数。

  • 我可以经常浏览图书馆。 (效率不高)
  • 我可以有一个阻止函数,一旦事件发生就会返回。 (不方便,特别是当我想停止申请时)

1 个答案:

答案 0 :(得分:1)

您可以为库提供post_event功能。每当一个事件发生在库想要发布到GUI时,它就会调用这个函数。

post函数可能是阻塞(它在处理完事件后返回)或非阻塞(它只是在GUI的消息循环中发布事件并立即返回)。或者它可能阻止某些事件而不是其他事件。

举个例子:

用户调用库初始化:

int post_event(int eventID, long prm1, long prm2); // prototype
myLibInit(post_event);                            // call

内部库初始化:

static int (*libPostEvent)(int eventID, long prm1, long prm2); // global variable with pointer to user's post function
void myLibInit( int(*f)(int,long,long)) {
    libPostEvent= f;
}

库中的事件发生器

    ...
    switch (libPostEvent(eventID, prm1, prm2)) {
    case ... // handle result
    }

内部GUI:

int post_event(int eventID, long prm1, long prm2)
{
    switch (eventID) {
    case EVENT1: putmsgqueu(EVENT1, prm1); return 1; // non-blocking
    case EVENT2: return(do_something());             // blocking
    }
    return 0; // not handled
}