我正在使用boost :: asio来做一些非常基本的UDP数据包收集.io_service对象在工作线程中实例化,并且从该线程内部调用io_service.run().我的问题是当我收集数据包时让io_service.run()返回.
我不清楚当停止我的工作线程时,可以从其他线程调用哪些io_service方法.我有一个对io_service对象的引用,并且从另一个线程我进行了这个调用:
ios.dispatch( boost::bind( &udp_server::handle_kill, this ) );
Run Code Online (Sandbox Code Playgroud)
在我的udp_server类中,该函数的处理程序从一个boost :: asio :: ip :: udp :: socket和一个boost :: asio :: deadline_timer对象中取消待处理的工作.两者都有未决的异步工作要做.那时我调用ios.stop():
void udp_server::handle_kill()
{
m_socket.cancel();
m_timer.cancel();
m_ios.stop();
}
Run Code Online (Sandbox Code Playgroud)
由于没有待处理的工作,我希望此时我对ios.run()的调用应该返回 - 但这不会发生.
那为什么不回来呢?对我来说最可能的解释是我不应该从另一个线程调用io_service :: dispatch().但是dispatch()方法似乎只是为了做到这一点 - 在io_service :: run()工作的线程中调度一个函数调用.它似乎就是这样做的.
所以这给我留下了一些相关的问题:
asio对我来说表现很好,但我需要更好地理解这一点架构.
socket :: udp :: cancel()在Win32下的开放套接字上显然是一个不受支持的操作 - 所以这个操作失败了抛出一个异常 - 这实际上导致从io_service :: run()退出,但绝对不是所希望的出口.
socket :: udp :: close()似乎没有取消挂起的async_receive_from()任务,所以调用它而不是socket :: udp :: cancel()似乎将线程留在io_service :: run()中的某个地方.
我有一个测试程序,它使用用pipe()创建的未命名管道在Linux系统上用fork()创建的父进程和子进程之间进行通信.
通常,当发送进程关闭管道的写入fd时,接收进程从read()返回值0,表示EOF.
但是,似乎如果我在接收器开始读取之前填充了相当大量的数据(可能是100K字节0),接收器在读取管道中的所有数据后阻塞 - 即使发送方已关闭它.
我已经验证发送过程已经用lsof关闭了管道,并且看起来非常清楚接收器被阻塞了.
这导致了一个问题:关闭管道的一端是一个可靠的方法让接收器知道没有更多的数据?
如果是,并且没有条件可以导致空的,关闭的FIFO上的read()阻塞,那么我的代码就会出错.如果不是,这意味着我需要找到一种发信号通知数据流结束的替代方法.
解析度
我很确定最初的假设是正确的,关闭管道导致读者端的EOF,这个问题只是在黑暗中拍摄 - 想想也许我忽略了一些微妙的管道行为.几乎你用管道看到的每个例子都是一个发送几个字节并退出的玩具.当您不再进行原子操作时,事情通常会有所不同.
在任何情况下,我都试图简化我的代码以清除问题并成功找到我的问题.在伪代码中,我最终做了这样的事情:
create pipe1
if ( !fork() ) {
close pipe1 write fd
do some stuff reading pipe1 until EOF
}
create pipe2
if ( !fork() ) {
close pipe2 write fd
do some stuff reading pipe2 until EOF
}
close pipe1 read fd
close pipe2 read fd
write data to pipe1
get completion response from child 1
close pipe1 write fd
write data to pipe2
get completion response …Run Code Online (Sandbox Code Playgroud) 我希望在Eclipse中使用Qt插件.安装非常简单 - 只需在适当的目录中展开tarball即可.这样做之后,我可以在eclipse/features和eclipse/plugins下看到trolltech文件夹.但是,当我尝试创建项目时,我看不到任何Qt选项的迹象.我也没有在插件或功能的已安装软件列表中看到Qt.
Eclipse:Galileo Build 3.5.2
CDT:6.0.0.2
O/S:Ubuntu 10.10 i686 2.6.35-28-generic
tarball中的插件:qt-eclipse-integration-linux.x86.1.6.1.tar.gz来自:http://qt.nokia.com/developer/eclipse-integration/
使用-consolelog -debug启动Eclipse并没有提供任何启示
Qt插件是否已超过其使用日期?
更新
安装到/ usr/share/eclipse是一个错误
安装到/ usr/lib/eclipse有效
我建议Qt页面上的说明可以使用一些修订.而不是说:
找到你的eclipse/plugins文件夹
添加可能更好:eclipse文件夹应该包含eclipse可执行文件,eclipse.ini,plugins目录和features目录.
这样可以防止我被/ usr/share/eclipse所愚弄,它有一个功能目录和一个插件目录,但不是安装其他插件的正确位置.