gpt4 book ai didi

c - GLib 自定义事件源屏蔽

转载 作者:行者123 更新时间:2023-11-30 16:39:14 25 4
gpt4 key购买 nike

上下文:我创建了自定义事件源,如 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?是否可能或者我需要删除/重新创建源或自己实现自定义源管理逻辑(例如在我的代码中设置标志并在准备函数中检查此标志)?

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

最佳答案

如果没有示例代码,很难准确说出您的设置是什么。

但是,一般来说:

  • 如果您编写了自己的 GSource 实现,则应通过从 its check function 返回 FALSE 来禁用它.
  • 如果您使用的是预先存在的 GSource 实现,则应通过尽早从其回调函数返回来禁用它。
    • Removingre-adding来源要贵得多。如果您想长时间禁用它,您可以这样做,但如果您只想禁用一两个回调的源,则不要这样做。

关于c - GLib 自定义事件源屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47132584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com