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

관련 정보