【问题标题】:How to be sure that mount command is actually finished in qt process如何确保在 qt 进程中实际完成 mount 命令
【发布时间】:2020-01-30 15:04:43
【问题描述】:

我正在开发一个用 qt5 编写的程序,我需要在其中安装一些设备(USB 驱动器)并在 GUI 中显示该设备的内容。 我正在使用 QProcess() 来安装设备,然后我探索应该安装设备的文件夹。不幸的是,只能找到几个文件。

我尝试在 mount 命令之后添加一个 QThread::sleep() ,这实际上适用于小型设备。因此,我的方法的正确性似乎取决于我等待系统实际安装设备的时间。

pr3.start("mount foo foo");
pr3.waitForFinished(-1);
QThread::sleep(6); //This is a patch but it fail depending on the amount of file stored in the device

有什么方法可以确定 QProcess("mount") 何时正确完成? 我尝试了 QProcess 的 wawtforfinished(-1) 方法,但它没有 似乎工作。

谢谢

【问题讨论】:

  • 在任何情况下都需要做的一件事是检查已运行的挂载命令的返回码。挂载是否成功退出,也就是说返回码是什么?
  • 嗨,我试图将进程连接到完成信号...事实是该信号是即时调用的,而不是在文件正确安装时调用。我认为这就像在linux中一样。 “mount”命令会自动返回控制台。即使您需要一个“同步”命令来使一切正常。我试图用同步来做另一个过程,但没用
  • @Talkanian,我认为您还必须为该过程创建 参数列表 并将 foofoo 连接为参数 .. 或 .. 输入您的挂载命令在您作为 QProcess 调用的脚本中使用参数,无论哪种方式,将单个命令作为 QProcess .. 传递,参数作为参数列表。

标签: c++ linux qt command mount


【解决方案1】:

首先,我建议您使用以下信号 finished() 并将其连接到检​​查 退出代码退出状态 的插槽,而不是使用waitForFinished().
事实上,文档中提到了waitForFinished()

警告:从主 (GUI) 线程调用此函数可能会导致您的用户界面冻结。

当然它假设你有一个事件循环。


另外,你的mount foo foo 命令似乎是错误的。第一个参数是设备本身,第二个参数是挂载设备的目录。你不能给两次相同的参数。


如果这不能帮助解决您的问题,请告诉我。

【讨论】:

  • 嗨,我试图将进程连接到完成信号...事实是该信号是即时调用的,而不是在文件正确安装时调用。我认为这就像在linux中一样。 “mount”命令会自动返回控制台。即使您需要一个“同步”命令来使一切正常。我试图用同步来做另一个过程,但没用。
  • @Talkanian 退出状态是什么?该过程完成时发出信号。在 bash 中也是一样,函数在完成时返回。如果挂载在调用后立即返回并且没有执行,那么我怀疑有错误。你必须检查错误,如果你不检查,你就无法推断出任何东西。
  • @Fereanor 我得到了 QProcess::ExitStatus(NormalExit) ,退出代码 = 0。所以我认为一切都很好...... Beacouse......正如我所说......如果我放一个睡觉并等待...驱动器似乎安装得很好。
  • @Talkanian 好吧,看起来很奇怪。有时间我会做一些测试。
【解决方案2】:

我尝试了 QProcess 的 wawtforfinished(-1) 方法,但没有 似乎有效。

这是一个很大的危险信号,正在发生一些奇怪的事情。

以编程方式启动子进程时,通常需要进行大量错误处理和报告。

这也可能包括但不限于 mount 命令未按预期工作等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 2011-08-22
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多