Ошибка преобразования канала (обработчик) в fd на 2003 - PullRequest
0 голосов
/ 07 августа 2009

Я пытаюсь использовать уведомление основного потока gtk (из отдельного потока), что некоторые даже произошли с использованием каналов. Я получаю следующее предупреждение, когда пытаюсь настроить каналы. Что такое хороший обходной путь?

когда я могу это g_io_channel_win32_new_fd, я вижу это предупреждение, и, таким образом, канал вообще не создается: (

GLib-WARNING **: giowin32.c: 1564: 3 не является дескриптором файла библиотеки C

    int fds[2];
    GIOChannel* gioChannels[2];
    HANDLE rdPipe, wrPipe;
    SECURITY_ATTRIBUTES saAttr;

    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL;
    if (CreatePipe(&rdPipe, &wrPipe, NULL, 1024)) 
    {
       fds[0]  =_open_osfhandle((gssize)rdPipe,  O_RDONLY); 
       fds[1] = _open_osfhandle((long)wrPipe,_O_APPEND);

       gioChannels[0] =g_io_channel_win32_new_fd(fds[0] );
       gioChannels[1] =g_io_channel_win32_new_fd(fds[0] );

       g_io_add_watch( gioChannels[1],(GIOCondition) (G_IO_IN | G_IO_HUP), 
                        (GIOFunc)SomeCallaback,(gpointer)this );

    }

Цель состоит в том, чтобы уведомить основное приложение о том, что что-то произошло в потоке потока. В моем случае я не могу использовать gtk многопоточным способом (вызывая функции основного потока из порожденного), поэтому я пытаюсь сделать это через каналы.

Я также видел, что это может быть проблема визуальной студии в этой теме

Есть предложения?

1 Ответ

1 голос
/ 07 августа 2009

Как говорит ошибка, дескрипторы, созданные CreatePipe, не являются дескрипторами файлов. Модель программирования Windows не использует файловые дескрипторы, поэтому вы не можете нормально смешивать и сопоставлять функции ввода-вывода Windows и не-Windows. Я подозреваю, что если вы удалите некоторые приведения в вашем коде, ваш компилятор точно определит проблему - C-style (или переинтерпретировать) casr в C ++ коде почти всегда признак того, что вы делаете что-то не так.

...