GLib自定义事件源屏蔽

时间:2017-11-06 08:27:06

标签: c glib

上下文 我按照this guide中的说明创建了自定义事件源。 我的简化代码:

#define DEFAULT_POLL_TIMEOUT    100

typedef struct{
    GSource source;
    std::string file_path;
}FileObserverSource;

static GSourceFuncs fobserver_source_funcs{
    FobserverPrepare,
    NULL,  /* check */
    FobserverDispatch,
    FobserverFinalize
};

GSource *FOBS_ObserverConstruct(std::string file_path, GSourceFunc callback){
    GSource *source=g_source_new(&fobserver_source_funcs, sizeof(FileObserverSource));
    FileObserverSource *fobserver_source=(FileObserverSource *)source;
    fobserver_source->file_path=file_path;
    g_source_set_callback(source,callback,NULL,NULL);
    return source;
}

static gboolean FobserverPrepare(GSource *source, gint *timeout_){
    gboolean ret=false;
    FileObserverSource *fobserver_source=(FileObserverSource *)source;
    if(FOBS_ScanForFile(fobserver_source->file_path.c_str())){
        ret=true;
    }
    if(!ret){
        *timeout_=DEFAULT_POLL_TIMEOUT;
    }
    return ret;
}

static gboolean FobserverDispatch (GSource *source, GSourceFunc callback,gpointer user_data){
    FileObserverSource *fobserver_source=(FileObserverSource *)source;
    callback((gpointer)fobserver_source->file_path.c_str());
    return TRUE;
}

static void FobserverFinalize (GSource *source){
}

int main(void){
    GMainLoop *loop = g_main_loop_new( NULL , FALSE );
    GMainContext *main_context=g_main_loop_get_context(loop);
    g_source_attach(FOBS_ObserverConstruct(ws_file_path,ProcessCMDFile),main_context); 
    g_main_loop_run(loop);
}

问题:现在我想临时关闭连续源检查取决于某些程序内部状态。

glib是否为屏蔽事件源提供api? 是否有可能或者我需要自己删除/重新创建源或实现自定义源管理逻辑(例如在我的代码中设置标志并在prepare函数中检查此标志)?

正如我在文档g_source_destroy()中读到的那样,销毁源代码并且我无法重复使用它。

1 个答案:

答案 0 :(得分:0)

如果没有示例代码,很难准确说明您的设置。

但是,一般来说:

  • 如果您已编写自己的GSource实施方案,则应从its check function返回FALSE来停用该实施方案。
  • 如果您使用预先存在的GSource实现,则应该通过提前从其回调函数返回来禁用它。
    • Removingre-adding来源要贵得多。如果要长时间禁用它,可以执行此操作,但如果您只是禁用一个或两个回调的源,则不要这样做。