我需要将文件描述符附加到GLIB主循环。我的问题是文件描述符列表在执行期间没有修复。
根据GLIB文件,我可以:
我的问题是:是否可以动态修改源或上下文。我怎么能这样做?我找到了GSourceFuncs的能力,但这并不适合我的问题。
感谢您的帮助。
答案 0 :(得分:1)
g_io_add_watch
会返回一个事件来源ID,您稍后可以使用g_source_remove
再次动态删除该手表。每个FD使用一个事件源,而不是修改现有的手表,删除旧手表并创建适当的新手表。
答案 1 :(得分:1)
我更多地研究了GLIB,现在:
我的问题是,如果没有FD,准备回调会按预期每1s调用一次。添加FD时,将调用prepare回调而不会超时。民意调查直接退出。
我查看了GLIB源代码,但不明白原因?
请帮助 此致
答案 2 :(得分:0)
amenophiks'答案是最好的。
如果您希望代码使用较旧的glib ,您可以使用:
答案 3 :(得分:0)
您已阅读Main Event Loop文档吗?描述部分很好地说明了工作原理。
您是否看过Custom GSource教程?这使您可以扩展GSource对象以包括自己的状态。您还可以编写自己的准备,调度,查询和检查功能。
每当我真的想要查看如何使用GLib,GTK等进行操作时,我首先想到的是位于其git存储库中的测试代码。确保为要定位的版本签出正确的标签。
例如,我目前的目标是2.48.2
这是两个很好的例子 https://gitlab.gnome.org/GNOME/glib/blob/2.48.2/tests/mainloop-test.c https://gitlab.gnome.org/GNOME/glib/blob/2.48.2/glib/tests/mainloop.c
另一个不错的功能是它是一个git存储库,因此您可以非常轻松地搜索它。
答案 4 :(得分:0)
似乎,我找到了一个小钩子。试试这个:
struct source {
GSource gsrc;
GPollFD *gpfd;
};
struct data {
/* A something data. */
};
static gboolean gsrc_dispatch(GSource *gsrc, GSourceFunc cb, gpointer data);
static struct data * data_alloc(void);
static GSourceFuncs gsf = {
.prepare = NULL,
.check = NULL,
.dispatch = gsrc_dispatch,
.finalize = NULL
};
int main(void)
{
struct source *src;
int fd;
struct data *data = data_alloc();
/* Something other. */
/* For example, we are want to capture video from a camera. */
fd = open("/dev/video0", O_RDWR);
if (fd < 0) {
perror("open()");
return -1;
}
src = (struct source *) g_source_new(&gsf, sizeof(struct source));
src->gpfd = g_source_add_unix_fd((GSource *) src, fd, G_IO_IN);
g_source_set_callback((GSource *) src, NULL, data, NULL);
g_source_attach((GSource *) src, NULL);
/* Something other and free. */
return 0;
}
static gboolean
gsrc_dispatch(GSource *gsrc, GSourceFunc cb, gpointer data)
{
struct source *src = (struct source *) gsrc;
struct data *d = data;
if (src->gpfd != NULL) {
if (src->gpfd->revents & G_IO_IN) {
/* Capture a frame. */
}
}
g_main_context_iteration(NULL, TRUE);
return G_SOURCE_CONTINUE;
}
static struct data *
data_alloc(void)
{
/* Allocate a data. */
}
是的,您可以使用双gpfd
指针。