【问题标题】:changing threads standard input and output更改线程标准输入和输出
【发布时间】:2014-07-24 00:29:47
【问题描述】:

我有一个创建两个线程的应用程序。 (thread_1 用于 Qt GUI,thread_2 用于运行 TCL 解释器的应用程序)。

我希望 thread_1(Qt GUI)创建一个命令并将其发送到 thread_2(TCL 解释器)。

我正在考虑将thread_1的stdout连接到thread_2的stdin,我不知道该怎么做? 如果您知道如何做或可以提出不同的工作方式,我将不胜感激。

【问题讨论】:

  • hmm,如果您有线程,则不需要它们通过系统进行通信:只需设置一对std::list<message> 同步进行双向消息传递。
  • 我是新来的,你能举个例子或链接到我可以了解更多关于这个的地方吗?
  • 听起来你真正的问题是,“我如何在线程之间进行通信”。简短的回答是,您可以使用任何您喜欢的集合(列表、队列、映射、数组),只要您使用适当的同步机制(锁、互斥、信号量)来防止对集合的并发、冲突访问。
  • "...对于运行 TCL 解释器的应用程序" 你确定这是同一个进程中的两个线程吗?因为我通常不会将进程中的一个线程描述为“应用程序”。

标签: c++ multithreading qt tcl qtgui


【解决方案1】:

我提出的解决方案需要设置 2 个 std::queue<>std::list 让每个线程将消息传递给另一个线程,反之亦然。最简单的方法是让每个线程建立自己的传入消息队列,并让其他线程获得指向它的指针。首先,您需要队列数据类型的同步版本:正如我在评论中给出的那样,有一个实现 there

然后你只需要升级你的线程类(或可运行类,或任何你用作任务抽象的),在内部使用一个这样的队列,并使用一个可公开访问的 send 方法,以便其他任务可以给它发消息。然后,您的任务将不得不定期检查该队列是否有传入消息,并最终处理它。

注意:我从堆栈溢出本身获得了该页面,因为博客所有者是该社区的成员。请参阅 that page 谈论队列同步问题。

【讨论】:

    【解决方案2】:

    我不确定您为什么要在这里通过标准输入和输出,但我认为这个问题可能比您想象的要简单得多。我会亲自使用qt signal-slot mechanism,如下所示:

    connect(guiThreadSender, SIGNAL(sendCommand(const QByteArray&)),
            tclThreadReceiver, SLOT(handleCommand(const QByteArray&)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 2011-02-13
      • 1970-01-01
      • 2013-06-13
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多