如何在主循环监听消息时的特定时间退出程序?

时间:2013-12-17 18:38:36

标签: c++ multithreading timer exit tibco

在主程序主循环中,我通过调用tibemsMsgConsumer_Receive来监听EMS主题。同时,我想在特定时间退出该计划,比如说下午5点。我该如何实现呢?

我尝试使用以下代码,但在没有收到消息的情况下,它无法正常工作。

有什么方法可以在' while'循环卡在那里?

while (1)
{
status = tibemsMsgConsumer_Receive(m_CmbsSpreadMatrixSubscriber, &msg);

  if (status == TIBEMS_OK)
  {
    DoSomething();
  }

  if (getRunTime("hour").c_str()) >= 18)
  {
    exit(0);
  }
}

2 个答案:

答案 0 :(得分:1)

使用tibemsMsgConsumer_ReceiveTimeout()并设置适当的超时以反复检查退出条件。

从该页面上的描述:

此功能使用来自消费者目的地的下一条消息。当目标没有准备好任何消息时,此功能将阻止:

  • 如果邮件到达目的地,则此呼叫会立即使用该邮件并返回。
  • 如果在消息到达之前经过了(非零)超时,则此调用返回TIBEMS_TIMEOUT。
  • 如果另一个线程关闭了使用者,则此调用返回TIBEMS_INTR。

答案 1 :(得分:0)

在开始主循环监听消息之前,我启动一个线程。

boost::thread aThread(&threadFunc); 

在线程函数中我只计算时间并退出程序。不知道 这是安全的,对与否......

void threadFunc()
{   
    while (true)
    {
        wait(60);

        if (atoi(getRunTime("hour").c_str()) >= 18)
        {
            Log("Now it's 6PM, let's stop and get back tomorrow.");
            exit(0);
        }
    }
}