GTKアプリケーションとシリアルポートハンドラ

GTKアプリケーションとシリアルポートハンドラ

私は組み込みボードにLinuxオペレーティングシステム用のGTK Cアプリケーションを書いています。

最初のメインウィンドウは、バーコードリーダーからデータを受信するためのシリアル(仮想)ポートを開きます。私は(私のOpenPort()関数内で)標準のopen()関数を使用しています。次に、g_io_channel_new_file()とg_io_add_watch()を呼び出してrx信号を処理します。

標準のopen()呼び出しは本当に必要ですか?

    if (g_config.fdRfid==-1)
        g_config.fdRfid = OpenPort( g_config.portRfid, B115200);

    if (g_config.fdRfid!=-1)
    {
        ShowMainMessage();
        
        GError *error = NULL;
        g_ioChannel = g_io_channel_new_file( g_config.portRfid, "r", &error);
        if (g_ioChannel)
        {
            guint source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);
            printf("> set watch ioCh: %p - source: %d\n", g_ioChannel, source);
        }
        else 
            gtk_label_set_text( GTK_LABEL(g_labelMsg2), error->message);

ボタンを押すと、ダイアログボックスのサブウィンドウが開きます。その前に、close()関数を介してシリアルポートを閉じ、g_io_channel_shutdown()関数を介して信号を切断します。返される状態は1 = G_IO_STATUS_NORMALです。

GIOStatus status = g_io_channel_shutdown( g_ioChannel, TRUE, NULL);
g_io_channel_unref(g_ioChannel);

if (g_config.fdRfid != -1) 
{
    ClosePort(&g_config.fdRfid);
}   

ダイアログウィンドウを実行して同じポートを再び開き(テスト用のウィンドウです)、前と同じ方法でrx信号を再接続しました。
デバッグ出力(printf経由)からバーコードを読み取ると、メインウィンドウのシグナルハンドラとダイアログボックスのハンドラの両方が呼び出されることがわかります。

ダイアログボックスを閉じる(ポートとチャンネルを閉じる...)メインウィンドウに戻ります。バーコードを読むと、3つのハンドラが起動します(メインウィンドウに2つ、ダイアログボックスに1つ)。

シグナルハンドラを切断する方法は?私のアプローチは不完全だと思います..

ありがとうございます!

答え1

解決しました!
私は電話を逃した

g_source_remove(source)

締め切り中。
もちろん、sourceグローバル変数を生成するために行を変更しました。

/*guint*/ source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);

関連情報