2014-11-23 15 views
0

我提出,从两个源接收命令的控制台应用程序:中断一个函数getline(),而循环在C++

  1. 实际控制台 - >这是一个while(函数getline())在一个单独的线程循环。
  2. 甲WebSocket伺服器 - >此也运行在一个单独的线程

如果有一个命令输入的命令,被存储在矢量直到另一个while循环(运行每20ms)循环槽的所有命令在过去的时间输入。如果他读取命令,他执行它。

现在,有一个Stop命令停止应用程序。输入时,应用程序按预期关闭。但问题是:这需要一些时间,并且仍然可以从第一个命令源(getline())输入文本。一旦你输入了一些东西,关机程序就会停止,并等到你按下输入。

一旦关闭序列开始,我终止第一个线程(包含getline循环)。但是这不起作用...

任何想法?

提前致谢!

+0

我不能这样做,因为那个线程不知道,当他收到那条消息时,已经太晚了...... – Antony 2014-11-23 12:04:21

+0

我无法上传50个类和头文件中存在的代码。我试图尽可能好地解释结构。我的代码是不需要的,我只需要一种方法来取消正在循环的getline()动作。如果你真的认为需要这些代码,我会尝试发布相关的代码。 – Antony 2014-11-23 12:30:13

回答

0

getline()是一个阻塞调用,如果您想从其他线程接收消息(即关闭命令),您可能必须使用不同的东西。你没有提到你用于多线程的库,以及如何终止控制台读线程(可能,你停止线程的方式仍然不会强制它从getline退出)

这个问题似乎有一些相关性回答:Peek stdin using pthreads

顺便说一句,你提到了一个向量,它是(如果我理解正确的话)从多个线程访问。您必须注意正确的同步(例如访问矢量时使用互斥锁)。另外,事实上你有一些循环,每20毫秒“轮询”一次矢量,这表明你在应用程序的整体设计中可能有一些缺陷。尝试通过使用更适当的方式在线程之间传递事件(如条件变量)来摆脱它。

+0

我使用线程的标准C++库。要向矢量添加一个字符串,我使用一个互斥体,所以没有问题。对于每20ms运行一次的循环:我没有看到其他选择,因为会有更多的线程发送命令。你用'使用不同的东西'意味着什么。我看了槽cin >>但它也是这样:它一直等到输入给出。 – Antony 2014-11-23 11:59:13