2013-07-04 125 views
0

我正尝试在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的代码是从旧货自动生成。告诉我你是否需要查看更多代码。我很感谢我能得到的所有帮助!代码的

部件in flume_types.h:在flume_types.c代码

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()) 

零件:main.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; 
} 

零件:

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属性是不是 C结构体成员。您需要在您的klass init函数(https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html)中通过g_object_install_property安装它们。您还需要从GObject(或来自GObject派生的任何结构)派生对象。

注:用C派生意味着,它必须有父作为其第一个成员,因此它可以无缝地投(而不是指向一个GObject!)

你应该在话题看书,它可以变得相当复杂。

0

这在节俭0.9.2改变:由C(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_字段由对象自身管理,不应直接设置。