4

GTK シグナルを作成して送信しようとしています:

g_signal_new("child-finished",
    G_TYPE_OBJECT,
    G_SIGNAL_RUN_FIRST,
    0,
    NULL, NULL,
    NULL,           // *** I think this is where I need to change it
    G_TYPE_NONE, 0);
g_signal_connect(G_OBJECT(myWindow), "child-finished", G_CALLBACK(MyCallback), NULL);

信号を発する私のコードは次のとおりです。

gtk_signal_emit_by_name(referenceToMyWindow, "child-finished");

そして、信号を処理する私のコードは次のとおりです。

void MyCallback(GtkWidget *w, GdkEvent *e)
{
    // handler code here
}

コードを実行すると、次のエラーが表示されます。

GLib-GObject-CRITICAL **: g _closure_invoke: assertion `closure->marshal || クロージャ ->meta_marshal' に失敗しました

マーシャラーを関数に渡すことと関係があることは知っていますがg_signal_new、マーシャラーが何であるかはわかりません。ドキュメントを理解できず、オンラインの例はほとんどありません。自分のシグナルを宣言して接続するにはどうすればよいですか?

4

1 に答える 1

3

GObjectライブラリにはいくつかの組み込みマーシャラーが用意されているため、コードは次のようになります。

g_signal_new("child-finished",
             G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
             0, NULL, NULL,
             g_cclosure_marshal_VOID__POINTER,
             G_TYPE_NONE, 1, G_TYPE_POINTER);

または、タイプチェックが必要な場合:

g_signal_new("child-finished",
             G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
             0, NULL, NULL,
             g_cclosure_marshal_VOID__BOXED,
             G_TYPE_NONE, 1, GDK_TYPE_EVENT);

シグナルハンドラーのパラメーターが存在する必要があるため(オブジェクト自体が暗黙指定されている)、ポインター(最初の例のように)またはボックス化されたタイプ(2番目の例のように)を必ず指定してください。

必要なマーシャラーが組み込みのマーシャラーに存在しない場合は、glib-genmarshalユーティリティを使用するか、自分で直接コーディングすることができます(非常に簡単で、glib-genmarshalの出力をチェックアウトするだけです)。

于 2009-10-12T21:47:52.607 に答える