上下文 我按照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()中读到的那样,销毁源代码并且我无法重复使用它。
答案 0 :(得分:0)
如果没有示例代码,很难准确说明您的设置。
但是,一般来说:
GSource
实施方案,则应从its check
function返回FALSE
来停用该实施方案。GSource
实现,则应该通过提前从其回调函数返回来禁用它。