【问题标题】:Best way to pass a struct within a struct to a GSourceFunc将结构中的结构传递给 GSourceFunc 的最佳方法
【发布时间】:2012-06-11 21:19:04
【问题描述】:

哪种方式最好让 S 成为 GSourceFunc?或者两者都不是?

typedef struct{
//...
}S;

struct MS{
//..
S *St;
};

static gboolean AL_Calback(gpointer data){
    S *St = (S*)user_data;
    St->Something = SomethingElse;
    return TRUE;
} 

int main (int argc, char *argv[]){

    //...
    MS *MainStruct = gnew0(MS, 1);
    Mainstruct->St = gnew0(S, 1);
    clutter_threads_add_timeout_full(G_PRIORITY_HIGH, 100, AL_Callback, MainStruct->St, NULL); 
    //...
    }

或者像这样,

typedef struct{
//...
}S;

struct MS{
//..
S St;
};

static gboolean AL_Calback(gpointer data){
    MS *MV = (MS*)user_data;
    MV->S.something = SomethingElse;    
    return TRUE;
} 

int main (int argc, char *argv[]){

    //...
    MS *MainStruct = gnew0(MS, 1);
    clutter_threads_add_timeout_full(G_PRIORITY_HIGH, 100, AL_Callback, MainStruct, NULL); 
    //...
    }

我尝试了其他方法,但无法让它们发挥作用。 clutter_add_timeout 需要将指针作为参数。

【问题讨论】:

    标签: c gtk gobject clutter


    【解决方案1】:

    如果您通过指针将参数传递给clutter_threads_add_timeout_Full,那么您可以只传递MainStructSt 成员的地址,从而减少对动态分配的需求(对于内部结构)。

    struct MainStruct{
      //..
      S St; // note: no pointer
    };
    
    // in main
    MainStruct* ms = gnew0(MS, 1);
    clutter_threads_add_timeout_Full(G_PRIORITY_HIGH, 100, AL_Callback, &(ms->St),
        NULL);
    

    编辑:更新代码以动态分配MainStruct 结构以避免ptomato 指出的可能的段错误

    【讨论】:

    • clutter_threads_add_timeout 不会让我通过任何东西,除了 gpointer,它实际上只是 (void*)
    • @MVTCplusplus - 然后忽略代码后面的句子。 a) 拥有一个指针成员和传递它之间没有区别; b) 拥有一个结构成员并传递其地址(内存分配差异除外)
    • 谢谢。我还没有做任何测试,但我认为你已经回答了我的问题。
    • @Attila,您的代码存在在ms 超出范围后运行回调的风险,从而导致段错误。
    猜你喜欢
    • 2011-06-12
    • 2023-03-22
    • 2016-12-15
    • 2023-03-15
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2023-03-08
    相关资源
    最近更新 更多