【发布时间】:2022-01-11 17:59:05
【问题描述】:
我在任何函数之外创建了一个结构:
//create structure
typedef struct _LabelPointers
{
GtkWidget *readstringslabel;
GtkWidget *snoteslabel;
GtkWidget *fnoteslabel;
GtkWidget *genericnoteslabel;
GtkWidget *tabslabel;
GtkWidget *chordslabel;
} MyLabelPointers;
然后,我在调用函数内部创建了一个标签结构:
//create structure of widget label pointers (to be passed to functions)
MyLabelPointers labelpointers;
labelpointers.readstringslabel = gtk_label_new("0");
labelpointers.snoteslabel = gtk_label_new("0");
labelpointers.fnoteslabel = gtk_label_new("0");
labelpointers.genericnoteslabel = gtk_label_new("0");
labelpointers.tabslabel = gtk_label_new("0");
labelpointers.chordslabel = gtk_label_new("0");
然后,我连接回调如下,传递&labelpointers:
g_signal_connect(G_OBJECT (window), "key_press_event",G_CALLBACK(pressspacebar), &labelpointers);
调用函数如下,接受*labelpointers:
gboolean pressspacebar (GtkWidget *widget, GdkEventKey *event, MyLabelPointers *lpointers)
然后我尝试更新labelpointers->readstringslabel 中的文本,如下所示:
gtk_label_set_text(GTK_LABEL(lpointers->readstringslabel), cdata);
或如:
gtk_label_set_text(GTK_LABEL(lpointers->readstringslabel), "NEW DATA");
它全部编译并运行,直到我得到“发生异常,分段错误”。就在错误之前,我打印到 shell 如下:
cout<<"before\n";
cout<<"lpointers.readstringslabel = "<<lpointers->readstringslabel<<"\n";
cout<<"lpointers.readstringslabel = "<<&lpointers->readstringslabel<<"\n";
cout<<"type = " << typeid(lpointers->readstringslabel).name() << "\n";
然后得到:
before
lpointers.readstringslabel = 0x4
lpointers.readstringslabel = 0x7fffffffd570
type = P10_GtkWidget
我希望这些信息足以帮助我解决这个我已经工作了三天的问题。不幸的是,即使是谷歌也没有帮我解决这个问题。
【问题讨论】:
-
请尝试提供一个完整且最小的示例来重现您的问题。
-
我已经确定这是一个线程问题。我在一个函数中创建了窗口,称为基于
按下的第二个函数,该函数用于执行例程来更新原始窗口中的标签 - 我了解到这是一个禁忌。我现在在被调用函数中创建第二个窗口,例程将显示更新后的标签。
标签: c++ exception struct callback gtk