资源暂时不可用
Posted
技术标签:
【中文标题】资源暂时不可用【英文标题】:Resource temporarily unavailable 【发布时间】:2013-04-23 11:54:31 【问题描述】:考虑一下这个线程,它就像一个定时器,向串口发送一些数据包:
void PlCThead::run()
while(1)
const char str[]=UPDATE_PACKET;
QByteArray built;
built.append(0x02);
built.append(0x05);
built.append(0x03);
emit requestForWriteAndReceive(built);
msleep(100);
emit 工作正常,它进入插槽,在那里,它只将 78 或 char x 写入串行而不是 3 个字节的数据包。
bool RS::rs_ThreadPlcDataAqustn(QByteArray byteArray)
QByteArray rd15Bytes;
char *data = byteArray.data();
int len = byteArray.length();
if(!rs_serialWrite(data, len))
qDebug() << "Failure:( rs_dataqustn: rs_plcWrite(data, len)";
emit plc_port_dscntd();
return false;
bool RS::rs_serialWrite(char* buff, size_t length)
int tries;
int len;
tries = 0;
QByteArray built((char*)buff, length);
qDebug() << built.toHex();
len = write(fd, buff, length);
qDebug() << len;
qDebug() << strerror(errno);
return true;
fd 是这样创建的:
fd = open(portPath, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK, S_IWUSR | S_IRUSR | S_IXUSR);
这是在主窗口中创建线程的方式:
rs_plc->rs_plcOpenPort((char *)"/dev/ttyS0"); /*/dev/ttyS3*/
PlCThead *thread = new PlCThead();
connect(thread, SIGNAL(requestForWriteAndReceive(QByteArray)), rs_plc, SLOT(rs_ThreadPlcDataAqustn(QByteArray )));
thread->start();
rs_plc 是 MainWindow 的私有成员。
strerror
返回此警告:
> Resource temporarily unavailable
有什么想法吗?这段代码在定时器上工作得很好,它已经过准确的检查和测试,但现在我需要添加这个线程而不是定时器。谢谢
【问题讨论】:
为什么你在信号中传输char str
而不是QByteArray
?
【参考方案1】:
您的问题不够完整,无法进行全面诊断,因为您没有展示fd
的创建方式、线程的设置方式(您说这是问题的一部分)等。
但是...您的resource temporarily unavailable
行是一个很大的提示。 write() 函数没有成功写入所有内容,因为它返回了一个错误(可能是EAGAIN
或EWOULDBLOCK
)。 fd
文件描述符附加到具有小缓冲区、没有缓冲区或缓冲区已满的内容。它已经满了,在它可以处理之前不发送任何其他内容是应用程序的工作。如果错误代码为EAGAIN
或EWOULDBLOCK
,则通常是睡觉,然后再次尝试写入。
但是,您说它返回 3,这实际上也表示“没有错误”。如果是这种情况,那么错误字符串将不会指代 write 本身,而是之前设置的 errno
。 (过去可能是 write
本身)。
简而言之,如果它被多次调用(很可能),您可能需要注意写入速度太快(而且它看起来像一个串行缓冲区,它肯定属于易于填充的类别-缓冲区)。
简而言之:如果它没有将所有字节写入fd
,那是因为它无法处理更多。
顺便说一句,这可能与qt
完全无关。都是关于write()
电话的。
【讨论】:
我更新了我上面的代码,还是不明白是什么问题 不确定这是否与 qt 无关,我加载 URL 时只有 3 行代码,它卡住了!在 3 台虚拟机和 1 台物理机上,在 strace 中出现完全相同的错误,我缺少什么?以上是关于资源暂时不可用的主要内容,如果未能解决你的问题,请参考以下文章