多线调用DBUS服务注意事项
转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>
1.多线程初始化,特别不要忘记调用dbus_g_thread_init。
2.确保不同线程使用不同的DBusConnection。DBUS提供了函数dbus_bus_get_private用于获取独立的DBusConnection,但dbus-glib并没有提供相应的函数,我们自己可以封装一个。
3.确保不同线程调用相同服务时不会使用同一个DBusProxy。如果使用了单实例,用下列方式让每个线程有独立的实例。
__thread是C99中新增的,用于线程局部存储的编译指令,这里它让每个线程访问不同的实例。
4.如果在非主线程调用异步函数或者接收事件,一定要有自己的GMainLoop和GMainContext,并用下列函数与DBusConnection关联。
~~the end~~
转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>
1.多线程初始化,特别不要忘记调用dbus_g_thread_init。
- g_type_init();
- g_thread_init(NULL);
- dbus_g_thread_init();
2.确保不同线程使用不同的DBusConnection。DBUS提供了函数dbus_bus_get_private用于获取独立的DBusConnection,但dbus-glib并没有提供相应的函数,我们自己可以封装一个。
- staticinline
- DBusGConnection*dbus_g_bus_get_private(DBusBusTypetype,
- GMainContext*main_context,
- GError**error)
- {
- DBusConnection*connection=NULL;
- DBusErrorderror={0};
- g_return_val_if_fail(error==NULL||*error==NULL,NULL);
- //XXX:makesurethisfunctioniscalledinmainthreadbycallingdbus_g_bus_get
- //_dbus_g_value_types_init();
- dbus_error_init(&derror);
- connection=dbus_bus_get_private(type,&derror);
- if(connection==NULL)
- {
- dbus_set_g_error(error,&derror);
- dbus_error_free(&derror);
- returnNULL;
- }
- /*doesnothingifit'salreadybeendone*/
- dbus_connection_setup_with_g_main(connection,main_context);
- returnDBUS_G_CONNECTION_FROM_CONNECTION(connection);
- }
3.确保不同线程调用相同服务时不会使用同一个DBusProxy。如果使用了单实例,用下列方式让每个线程有独立的实例。
- EventManager*event_manager_get_default(void)
- {
- static__threadEventManager*event_manager=NULL;
- if(event_manager==NULL)
- {
- event_manager=event_manager_create();
- }
- returnevent_manager;
- }
__thread是C99中新增的,用于线程局部存储的编译指令,这里它让每个线程访问不同的实例。
4.如果在非主线程调用异步函数或者接收事件,一定要有自己的GMainLoop和GMainContext,并用下列函数与DBusConnection关联。
- dbus_connection_setup_with_g_main(connection,main_context);
~~the end~~