【问题标题】:How can i throw exception if processing don't response如果处理没有响应,我该如何抛出异常
【发布时间】:2016-08-14 00:06:52
【问题描述】:

我有 c++ clr 项目。 它使用一家公司的 API(如 Solidworks 的 api)。

所以..我的问题发生在这里。

BOOL rc = m_pc3dCore->Login(m_CdmUser, m_CdmUserPass, m_CdmServer);

尝试登录其他服务器应用程序。 但是,如果该应用程序不起作用,则不会有任何响应。我无法推进下一个来源。 Debuger 无限停留 "m_pc3dCore->Login(m_CdmUser, m_CdmUserPass, m_CdmServer);"

所以,我确实将其包装为使用 try{} catch(...){} 但没有改变任何东西。

我想抛出异常,如果它在那里停留 4 秒。 你能教我如何解决这个问题或搜索关键字吗?

---我的看法 我以为我使用 System::Thread 接口解决了这个问题。 所以我试着做一个方法。该方法会无限循环。

void threadFuncA()
{
    while(true){
    }
}

制作线程

Thread^ newThread = gcnew Thread(gcnew ThreadStart(threadFuncA));
newThread->Start();
newThread->Join();

调用newThread->Join()后程序开始无限循环; 是解决方案退出循环吗?

  • 我无法尝试使用 m_pc3dCore->Login(m_CdmUser, m_CdmUserPass, m_CdmServer); 因为该服务器现在正在工作,所以返回 True。结果我不能发生问题。这就是我制作无限循环方法的原因。

谢谢!

【问题讨论】:

    标签: c++ multithreading timeout


    【解决方案1】:

    在 UNIX 系统上,您可以通过信号中断阻塞的系统调用。 试试:

    alarm(4);
    BOOL rc = m_pc3dCore->Login(m_CdmUser, m_CdmUserPass, m_CdmServer);
    alarm(0);
    

    4 秒后,阻塞情况被中断,程序继续运行。 首先安装一个自写的 handler(int) 来诊断这种情况:

    signal(SIGALRM, handler);
    

    或在现代 UNIX 上使用 sigaction()。

    【讨论】:

    • 谢谢我使用 thread.join(int msec) 解决了酵母日。但我认为使用闹钟也可以解决。
    【解决方案2】:

    如果对Login() 的调用本身不会因超时而返回,您可能需要实施某种轮询。

    Here 是一篇关于轮询、回调和事件的文章。 here 是一篇关于一些新的语言特性的文章,可以帮助你实现你的目标。希望这至少可以为您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多