linux - QT 和 I/O 可能的错误

标签 linux qt qfile qbytearray qiodevice

请从 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/

相关文章:

c - C 中的 FILE 指针不返回 NULL

python - 如何在 blender 上使用Anaconda环境?

c++ - 如何在 Qt 5 中写入和读取 QResource 文件?

c++ - Qt:告诉程序从放置它的同一目录中读取其他文件

c++ - Qt:QFileSystemModel 按表达式过滤掉目录(不是文件)

linux - 在 linux 上安装多个包(比如 pip install -r requirements.txt)

python - 在 Linux 上运行 Tensorflow 代码时出错

Qt 安装程序框架 - 删除维护工具

c++ - Qt 自动化测试

c++ - 使用 QPointer 和 QObject::connect 与 C++11