2013-07-04 2 views
0

Я пытаюсь создать клиента flute-бережливости в c (c_glib), но не удается создать объект gobject, который должен быть отправлен на сервер. Я получаю следующее сообщение об ошибке в строке в main.c:GLib-GObject-Предупреждение при создании gobject

`GLib-GObject-WARNING **: IA__g_object_new_valist: object class `ThriftFlumeEventType' has no property named `timestamp'` 

Код в flume_types.h и flume_types.c будет автоматически сгенерирован из бережливости. Скажите, если вам нужно увидеть больше кода. Я благодарен за всю помощь, которую я могу получить!

Часть коды в flume_types.h:

struct _ThriftFlumeEvent 
{ 
    ThriftStruct parent; 

    /* public */ 
    gint64 timestamp; 
    gboolean __isset_timestamp; 
    Priority priority; 
    gboolean __isset_priority; 
    GByteArray * body; 
    gboolean __isset_body; 
    gint64 nanos; 
    gboolean __isset_nanos; 
    gchar * host; 
    gboolean __isset_host; 
    GHashTable * fields; 
    gboolean __isset_fields; 
}; 
typedef struct _ThriftFlumeEvent ThriftFlumeEvent; 


GType thrift_flume_event_get_type (void); 
#define TYPE_THRIFT_FLUME_EVENT (thrift_flume_event_get_type()) 

части коды в flume_types.c:

void 
thrift_flume_event_instance_init (ThriftFlumeEvent * object) 
{ 
    printf("thrift_flume_event_instance_init"); 

    /* satisfy -Wall */ 
    THRIFT_UNUSED_VAR (object); 
    object->timestamp = 0; 
    object->__isset_timestamp = FALSE; 
    object->__isset_priority = FALSE; 
    object->body = NULL; 
    object->__isset_body = FALSE; 
    object->nanos = 0; 
    object->__isset_nanos = FALSE; 
    object->host = NULL; 
    object->__isset_host = FALSE; 
    object->fields = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); 
    object->__isset_fields = FALSE; 
} 

GType 
thrift_flume_event_get_type (void) 
{ 
    static GType type = 0; 

    if (type == 0) 
    { 
    static const GTypeInfo type_info = 
    { 
     sizeof (ThriftFlumeEventClass), 
     NULL, /* base_init */ 
     NULL, /* base_finalize */ 
     (GClassInitFunc) thrift_flume_event_class_init, 
     NULL, /* class_finalize */ 
     NULL, /* class_data */ 
     sizeof (ThriftFlumeEvent), 
     0, /* n_preallocs */ 
     (GInstanceInitFunc) thrift_flume_event_instance_init, 
     NULL, /* value_table */ 
    }; 

    type = g_type_register_static (THRIFT_TYPE_STRUCT, 
            "ThriftFlumeEventType", 
            &type_info, 0); 
    type.timestamp; 
    } 

    return type; 
} 

части коды в main.c:

gpointer eventObj = g_object_new(TYPE_THRIFT_FLUME_EVENT, 
            "timestamp", 0, 
            "__isset_timestamp", 0, 
            "priority", 0, 
            "__isset_priority", 0, 
            "body", 0, 
            "__isset_body", 0, 
            "nanos", 0, 
            "__isset_nanos", 0, 
            "fields", 0, 
            "__isset_fields", 0, 
            0); 

ответ

0

Это было решением проблемы:

ThriftFlumeEvent *event = g_object_new(TYPE_THRIFT_FLUME_EVENT, 0); 
event->timestamp = (gint64)t_stamp.tv_sec * 1000; 
event->__isset_timestamp = TRUE; 
event->priority = priority; 
event->__isset_priority = TRUE; 
... 
+0

Но это вовсе не свойства GObject ... – drahnr

0

GObject Недвижимость NOT Элементы структуры C. Вам необходимо установить их через g_object_install_property в свою функцию инициализации klass (https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html). Вам также необходимо получить объект из GObject (или из любой структуры, которая получена из GObject).

Примечание: полученный в C означает, что он должен иметь родителя в качестве своего первого элемента, так что может быть брошено плавно (не указатель на GObject!)

Вы должны прочитать книгу на эту тему, он может стать довольно сложным.

0

Это меняется в бережливости 0.9.2: Объекты, генерируемые С (GLib) компилятором для представления БЕРЕЖЛИВОСТИ структур теперь будет подвергать свои член в качестве свойств GObject, устраняя рискованную (и бедную) практику изменения структуры экземпляра объекта напрямую.

Начиная с 0.9.2 предпочтительный способ инициализации объекта STRUCT будет по существу то, что плакат первоначально ожидалось:

ThriftFlumeEvent *event = 
    g_object_new (TYPE_THRIFT_FLUME_EVENT, 
       "timestamp", (gint64)t_stamp.tv_sec * 1000, 
       "priority", priority, 
       ... 
       NULL); 

Обратите внимание на __isset_ поля управляются самим объектом и не должны быть установлены непосредственно.

Смежные вопросы