转载时请注明出处和作者联系方式
作者联系方式:李先静 <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并没有提供相应的函数,我们自己可以封装一个。
- static inline
- DBusGConnection* dbus_g_bus_get_private (DBusBusType type,
- GMainContext* main_context,
- GError **error)
- {
- DBusConnection *connection = NULL;
- DBusError derror = {0};
- g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- //XXX:make sure this function is called in main thread by calling dbus_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);
- return NULL;
- }
- /* does nothing if it's already been done */
- dbus_connection_setup_with_g_main (connection, main_context);
- return DBUS_G_CONNECTION_FROM_CONNECTION (connection);
- }
3.确保不同线程调用相同服务时不会使用同一个DBusProxy。如果使用了单实例,用下列方式让每个线程有独立的实例。
- EventManager* event_manager_get_default(void)
- {
- static __thread EventManager* event_manager = NULL;
- if(event_manager == NULL)
- {
- event_manager = event_manager_create();
- }
- return event_manager;
- }
__thread是C99中新增的,用于线程局部存储的编译指令,这里它让每个线程访问不同的实例。
4.如果在非主线程调用异步函数或者接收事件,一定要有自己的GMainLoop和GMainContext,并用下列函数与DBusConnection关联。
- dbus_connection_setup_with_g_main (connection, main_context);
~~the end~~