【问题标题】:Application freeze in 3rd party library call3rd 方库调用中的应用程序冻结
【发布时间】:2015-09-04 07:38:31
【问题描述】:

我正在开发一个c++ 测量软件,它使用a 3rd party API 作为所有传感器连接的接口。此 API 不是开源的,也没有可用的调试库。

在某些情况下,当开始从接口读取值时,软件会冻结。虽然我无法确定是什么标准导致了问题以及为什么到目前为止它只发生有时,但我想拦截冻结并实施一些错误处理,这也可以让我更好地调试问题。

在我的代码中,我只是有一个电话

BOOL result = false;
result = pciadioAIStartConversion(board_index, channel_nr, range);

如果发生错误,pciadioAIStartConversion 永远不会返回。我正在寻找一些简单的功能来保持软件运行并在调用时间过长时返回。

我正在使用 Qt 框架 (4.8.6),因此可能的解决方案是使用事件系统和 QTimer,但因此如果我没记错的话,调用将需要它自己的线程,这似乎对我来说有点矫枉过正。

【问题讨论】:

  • 我认为除了产生一个单独的线程之外没有任何方法可以实现超时。
  • 您可以创建一个单独的QProcess,它会从 3rdparty 库进行调用,并使用QLocalSocketstd::cin / std::cout 进行通信。如果您没有得到响应,您可以安全地终止进程。它比终止线程更安全。
  • 如果您的外部软件组件冻结,它可能仍然持有资源,即使它会被杀死。也许外部设备处于未定义状态,简单地重新启动线程将无济于事。根据我的经验,依赖损坏的库并不是一个好主意。重新启动软件的解决方法听起来很糟糕。

标签: c++ qt


【解决方案1】:

piezol 是对的 你需要一个单独的线程,这可能会很混乱,但好消息是 Qt 线程框架(称为 QtConcurrent)真的很有帮助。

这是一个在单独的线程中运行标准函数并对其进行控制的示例。

#include <QDebug>
#include <QThread>
#include <QString>
#include <qtconcurrentrun.h>
#include <QApplication>

using namespace QtConcurrent;

void hello(QString name)
{
    qDebug() << "Hello" << name << "from" << QThread::currentThread();
}

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QFuture<void> f1 = run(hello, QString("Alice"));
    QFuture<void> f2 = run(hello, QString("Bob"));
    f1.waitForFinished();       
    f2.waitForFinished();     
} 

【讨论】:

  • 这个看起来很有希望,目前还没有使用并发模块。但是我在QFuture 的文档中找不到给定时间的waitForFinished() 方法,我错过了什么我是瞎了吗?
  • 不,你不是盲人,我是,我从 QProcess waitforFinshed 而不是 QFuture 中获取了文档,看起来你将不得不使用计时器
  • QFutureWatcher 是您应该使用的。 waitForXxx 方法会阻止 GUI。
猜你喜欢
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多