1

大家好,

我正在使用以下代码打开和显示 html 内容。

 void MyClass::playHtml(QString filePath, int w, int h) {
    QUrl url = QUrl::fromLocalFile(filePath);

    mWidget = new QWebView(this);
    mWidget->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
    mWidget->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
    mWidget->setGeometry(0, 0, width(), height());

    float h_scale = (float) height() / h;
    float w_scale = (float) width() / w;
    float zoom = 1.0;
    if (h_scale < w_scale) {
        zoom = h_scale;
    } else {
        zoom = w_scale;
    }
    mWidget->setZoomFactor(zoom);
    mWidget->load(url);

    mWidget->show();
}

要复制到剪贴板,请将视图切换到纯文本模式
这是在 MyClass 内部,它设置自己的几何图形,并且此函数QWebView适当地缩放以保持纵横比。删除mWidget(QWebView pointer)MyClass 对象时将调用 的删除。以下是它的调用过程。

1.) MyClass 被实例化为“mclass”。

2.) 实例化后,在mclass对象上调用上面的playHtml方法

3.) 上面的 playHtml 方法获取位于独立文件夹中的 html 文件的完整路径,w/h 是用于缩放的 html 内容的预定尺寸

4.) 大约 25 秒后,mclass 对象被删除

4a.) 在这 25 秒内,playHtml 方法适当地缩放 html 内容,并加载 html 文件。动画等发生了很多javascript。

5.) 删除后发生 MyClass 的另一个实例化并重复该过程

这个过程一天可以重复3000次,一个接一个。在此期间,cpu 和 ram 均不征税。我在上面的过程中唯一遗漏的是日志记录。我安装了一个 MessageHandler 来记录 qDebug 和其他消息。

这是我在上述过程运行一段时间后(从几个小时到几天)在日志中看到的内容。

每个“MyClass”实例都有一堆这些:

CRITICAL: QWindowsBackingStore::flush: GetDC failed ()

然后是每个“MyClass”实例中的一堆:

CRITICAL: QWindowsBackingStore::flush: BitBlt failed ()

紧随其后的是崩溃。

在事件查看器中,我收到崩溃“错误”消息。它始终位于这些故障模块之一 MSVCR100.dll 或 Qt5Webkit 或 Qt5WebkitWidget dll 之一中。

我没有专门画任何东西。我依靠 QWebView 来做到这一点——无论是绘制本身还是它包含的内容。除非上述情况开始发生,否则它做得很好。除了软件之外,机器上没有其他任何东西在运行。

如何检测这样的错误?在这一点上,在他们到达日志之前,我对他们一无所知。我想在那之前检测并处理它们,但不确定如何。作为旁注,我想借此机会了解更多关于 Qt 和 C++ 的一般错误检测的信息。首先,我如何检测似乎在食物链上游发生的此类错误。我担心我被 Java/C# 提供的堆栈跟踪宠坏了。

环境信息:

  • Windows 7 专业版 64 位
  • Qt 5.2.1(32 位)
  • 使用VS2010编译

谢谢!

-杰森

4

0 回答 0