我正在尝试使用通知主要的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(从生成的主线程中调用主线程的函数),所以我试图通过管道来实现。
我也看到它可能是这个thread
中的视觉工作室问题有什么建议吗?
答案 0 :(得分:1)
与错误一样,CreatePipe创建的句柄不是文件描述符。 Windows编程模型不使用文件描述符,因此您通常无法混合和匹配Windows和非Windows I / O功能。我怀疑如果你删除了代码中的一些强制转换,你的编译器会找出问题--C ++风格(或重新解释)casrs in C ++ code 几乎总是表明你做错了什么。