【问题标题】:QT and I/O Possible errorQT 和 I/O 可能的错误
【发布时间】:2018-06-17 07:47:46
【问题描述】:

请从 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 中,我似乎没有收到错误。

【问题讨论】:

  • 发布显示问题的实际代码,而不仅仅是它的摘录。如果它现在太大,那么复制它并开始减少它,直到问题消失(从而让您对原因进行二进制搜索)或者您有足够小的样本来发布。不完整的片段通常不值得人们猜测。
  • 我只包含我的代码,以便人们可以看到我正在做的活动类型。一个好的答案不需要与我的代码相关,并且可以更通用地了解错误的实际含义

标签: linux qt qfile qbytearray qiodevice


【解决方案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);
}

【讨论】:

  • 感谢您的回复!我修复了你提到的问题,但我认为这个问题会在这个问题之后导致 seg 错误,无论哪种方式都很好 :) 只是为了确保我删除了所有删除以查看会发生什么并且仍然出现 I/O 错误。我感觉这个问题与 QIODevice 没有准备好或什么有关?
  • 您应该提供 SSCCE 和/或使用调试器。做心灵感应者很难。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多