0

请从 QT C++ 的角度描述“可能的 I/O”SIGIO 错误通常表示什么。我知道 I/O 代表输入/输出,但这就是我所知道的。我发现的唯一体面的信息是:http ://davmac.org/davpage/linux/async-io.html但它太通用了,无法帮助我解决我的问题。

我不一定需要一个答案来确切地告诉我我做错了什么(如下),但希望获得关于哪些活动通常会导致此错误以及它表明您做错了什么的更详细的答案。


剩下的部分会给你一个关于我正在做的活动的想法,但你的答案需要完全针对这个部分(我的代码),并且可以只描述错误指示的内容以及与之相关的任何特定 QT 信息

我有时在第一次循环时收到此错误,有时在 5 次左右循环后收到此错误。它使gui崩溃。这发生在 linux 上的 qt 4.8 中。下面是一段类似的代码,它发生在我的主 gui 的 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 中,我似乎没有收到错误。

4

2 回答 2

1

问题是你的一生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);
}
于 2018-01-08T11:48:20.780 回答
0

我发现当在 QEventLoops、IODevices 和 QThreads 中或周围错误地处理内存管理时会产生此错误。据我所知,它可以像段故障一样进行故障排除。

我发现导致此错误的两个(非常具体的)场景:

- 创建一个 QEventLoop 并连接到 stateChange。如果您需要同时使用这两者,删除 stateChange SLOT 中的项目可以创建一个竞争场景,更新 QEventLoop 正在使用的值。

- 如果希望手动发出 finished() 并让您的 QThread 连接到它。如果它在不知不觉中被触发,它可能会导致处理变量,如果您没有相应地编码,这些变量将不再存在。

于 2018-01-09T06:59:07.683 回答