将自己库的glib主循环运行到指定的线程中,怎么保证自己库内部的事件处理是在自己指定的主循环里面的,写一个例子
时间: 2024-02-21 20:57:29 浏览: 143
应用线程处理,经典小例子。可运行。
以下是一个简单的例子,演示如何将自己库的glib主循环运行到指定的线程中,并保证自己库内部的事件处理在自己指定的主循环中:
```c
#include <glib.h>
#include <pthread.h>
// 自己库的事件处理上下文
static GMainContext *my_context = NULL;
// 自己库的主循环
static GMainLoop *my_loop = NULL;
// 自己库的事件处理函数
static gboolean my_callback(gpointer data)
{
// 处理事件
g_print("my_callback called\n");
// 返回FALSE表示不再监听该事件
return FALSE;
}
// 自己库的初始化函数
void my_library_init()
{
// 创建自己库的事件处理上下文
my_context = g_main_context_new();
// 添加需要处理的事件到自己库的事件处理上下文
GSource *source = g_timeout_source_new(1000);
g_source_set_callback(source, my_callback, NULL, NULL);
g_source_attach(source, my_context);
g_source_unref(source);
// 将自己库的事件处理上下文和主循环进行关联
g_main_context_push_thread_default(my_context);
}
// 自己库的线程函数
void *my_library_thread(void *data)
{
// 创建自己库的主循环
my_loop = g_main_loop_new(my_context, FALSE);
// 运行自己库的主循环
g_main_loop_run(my_loop);
return NULL;
}
// 主程序函数
int main(int argc, char *argv[])
{
// 初始化GLib库
g_thread_init(NULL);
g_type_init();
// 初始化自己库
my_library_init();
// 创建自己库的线程
pthread_t tid;
pthread_create(&tid, NULL, my_library_thread, NULL);
// 主程序的事件处理上下文
GMainContext *main_context = g_main_context_default();
// 添加需要处理的事件到主程序的事件处理上下文
GSource *source = g_timeout_source_new(500);
g_source_set_callback(source, (GSourceFunc)g_main_loop_quit, my_loop, NULL);
g_source_attach(source, main_context);
g_source_unref(source);
// 在主程序的事件处理上下文中监听自己库的事件
while (1) {
g_main_context_iteration(main_context, TRUE);
}
return 0;
}
```
在该例子中,我们创建了一个自己库的事件处理上下文和主循环,并将需要处理的事件添加到该上下文中。然后,在主程序中,我们在主程序的事件处理上下文中添加了一个定时器事件,用于退出自己库的主循环。最后,在主程序的事件处理上下文中使用g_main_context_iteration()函数来监听自己库的事件。在自己库的线程函数中,我们使用g_main_loop_run()函数来运行自己库的主循环,确保自己库的事件处理都在自己指定的主循环中。
阅读全文