【问题标题】:How to get user feedback from QThread::run(), e.g. QMessageBox?如何从 QThread::run() 获取用户反馈,例如消息框?
【发布时间】:2012-07-04 18:59:50
【问题描述】:

我知道在单独的线程中运行任何类型的 GUI 小部件都是不好的。对于消息,这可以通过向主线程发出信号来克服。但是,如果线程需要用户输入,如何将答案返回给线程,以及该线程如何等待该答案?

我的特殊情况是一个使用来自 libssh 的 sftp 的应用程序。在连接和认证期间,用户可能需要回答一个或多个问题。但出于性能原因,所有 SSH/SFTP 内容都必须在单独的线程中运行。

【问题讨论】:

  • 有什么原因在启动线程之前无法获取用户的凭据?
  • 对于简单的密码身份验证就足够了,但 SSH 身份验证可能是交互式的,这意味着服务器会问你问题,你提供答案,然后服务器可能会再次提出新问题,等等。

标签: c++ qt qt4 libssh


【解决方案1】:

根本不可能在非 GUI 线程中使用 GUI 类。你可以做的是使用信号和槽来从一个线程到另一个线程交换信息。从你的工作线程发送一个信号并等待一个信号量,比如QWaitCondition。发回消息并附上答案。

在您的情况下,您还可以使用Qt::BlockingQueuedConnection 作为连接类型来停止您的工作线程,直到用户输入数据。 QInputDialog 也会等到用户完成输入数据。

【讨论】:

  • 如果你从工作线程发送一个信号,你为什么需要等待一个信号量?!工作线程中的 QObject 可以在自己的槽中接收回复。默认情况下,Qt 将使用适当的连接类型。
  • 该问题清楚地询问了工作线程如何“等待”答案。所以我认为这就是重点。如果不需要“手动”停止程序,那么我在第二句话中再次说过,可以使用信号和插槽来交换信息:发出带有回复的消息。但提问者似乎已经知道这一点,所以我可能误解了这个问题。
  • 完全没有必要显式等待。等待互斥锁是事件循环已经做的事情。 QObject,无论是否移动到非 GUI 线程,大部分时间都在等待:事实上,它始终不执行任何代码。 “等待”答案是与生俱来的。答案只是作为连接到 QObject 中的插槽的信号出现。在非 gui 线程中使用 GUI 类只需向小部件发送信号即可。您可以从一行代码发送一个虚构的信号,例如:要在 QLabel 上设置文本,您可以这样做 QMetaObject::invokeMethod(label, "setText", Q_ARG(QString, "foo"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2020-08-10
  • 2016-03-12
相关资源
最近更新 更多