请从 QT C++ 的角度描述“I/O Possible”SIGIO 错误通常表示什么。我知道 I/O 代表输入/输出,但我只知道这些。我找到的唯一体面的信息是:http://davmac.org/davpage/linux/async-io.html但它太笼统了,无法帮助我解决问题。
我不一定需要一个答案来确切地告诉我我做错了什么(如下),但希望得到一个更翔实的答案,说明哪些事件通常会导致这个错误,以及它表明你做错了什么。
剩下的部分会让您了解我正在做的事件,但您的回答需要完全针对这部分(我的代码),并且只能描述错误指示的内容和任何特定的 QT 信息与之相关
我有时会在第一次循环时收到此错误,有时会在大约 5 次循环后收到此错误。它使 gui 崩溃。这发生在 linux 上的 qt 4.8 中。下面是一段类似的代码,它发生在我的主图形用户界面的 QThread 上。
Test.h
QBuffer *qbuff;
QByteArray qbyte;
Test.cpp
void Test::callExample()
{
for (int i=0;i<10;i++)
{
wait(1);
example();
}
}
void Test::example()
{
QFile inFile("/public/sounds/test.wav");
inFile.open(QIODevice::ReadOnly);
QByteArray qbyte = inFile.readAll();
inFile.close();
qbuff=new QBuffer();
qbuff->setData(qbyte);
qbuff->open(QIODevice::ReadOnly);
qbuff->seek(0);
audioOutput->start(qbuff);
}
在我的完整代码中,在 example() 中我还有一个事件循环,完成后删除 qbuff 和 audioOutput。错误似乎来自不同的代码位置,最常见于事件循环从事件更改为 idleState 之后,但实际问题应该源自显示的代码。我还尝试将 callExample() 中的循环移动到我的事件循环内,甚至从我的主线程移动(因此每次调用都创建一个新线程)但我仍然遇到问题。如果没有循环并且函数只被调用一次,或者如果代码发生在我的主 gui 而不是 qthread 中,我似乎不会收到错误。
最佳答案
问题是您的 QByteArray qbyte;
的生命周期。它应该大于或等于 QBuffer *qbuff;
的生命周期。当您退出 example
方法时,qbyte
缓冲区不再存在并且您的 *qbuff
已损坏(指向不存在的对象)。
可能,您想编写 qbyte = inFile.readAll();
而不是声明局部变量?
void Test::example()
{
QFile inFile("/public/sounds/test.wav");
inFile.open(QIODevice::ReadOnly);
qbyte = inFile.readAll(); // Error was there, use your global variable
inFile.close();
qbuff=new QBuffer();
qbuff->setData(qbyte);
qbuff->open(QIODevice::ReadOnly);
qbuff->seek(0);
audioOutput->start(qbuff);
}
关于linux - QT 和 I/O 可能的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48148482/