0

我正在尝试使用通知主 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(从衍生的调用主线程的函数),所以我试图通过管道来实现。

我还看到这可能是这个线程中的视觉工作室问题

有什么建议么?

4

1 回答 1

1

就像错误所说,由 CreatePipe 创建的句柄不是文件描述符。Windows 编程模型不使用文件描述符,因此通常不能混合和匹配 Windows 和非 Windows I/O 函数。我怀疑如果您删除了代码中的一些强制转换,您的编译器会查明问题 - C++ 代码中的 C 风格(或重新解释)casrs 几乎总是表明您做错了什么。

于 2009-08-07T14:08:25.203 回答