【问题标题】:Executing function for some amount of time执行函数一段时间
【发布时间】:2016-02-22 10:09:26
【问题描述】:

如果之前有人问过这个问题,我很抱歉,但我没有找到与此相关的任何内容。这是为了我的理解。这不是家庭作业。 我只想在一段时间内执行一个功能。我怎么做?例如,

main()
{
    ....
    ....
    func();
    .....
    .....
}

function func()
{
    ......
    ......
}

在这里,我的主函数调用了另一个函数。我希望该功能只执行一分钟。在该函数中,我将从用户那里获取一些数据。所以,如果用户不输入数据,我不想永远被困在那个功能中。所以,不管那个时候函数是完成还是没有完成,我都想回到主函数,执行下一个操作。

有什么办法吗?我在 Windows 7 上,我正在使用 VS-2013。

【问题讨论】:

  • 我不知道有一种纯标准的 C++ 方法可以做到这一点,但可以使用操作系统功能来完成。你在哪个平台上?
  • 我在 Windows 7 上使用 Visual Studio 2013。
  • edit您的问题提供该信息并添加相关标签。抱歉,那我帮不了你了。
  • 不是纯 C++ 方式,但应该允许您确定套接字(在 unix 上是文件描述符,即键盘输入)当前是否具有可读取的信息而不会阻塞。但在 Windows 上,它可能只适用于网络内容......

标签: c++ windows winapi visual-studio-2013


【解决方案1】:

在windows下,选项是有限的。

最简单的选项是func() 显式地定期检查它已经执行了多长时间(例如,存储它的开始时间,定期检查自该开始时间以来经过的时间量),如果它已经超过你愿意。

可以(C++11 或更高版本)在另一个线程中执行该函数,并且main() 在所需时间段已过时向该线程发出信号。最好是合作完成。例如,main() 设置一个标志,线程函数检查该标志并在需要时退出。这样的标志通常由临界区或互斥体得到最好的保护。

windows下非常不安全的方法是main()强制终止线程。这是不安全的,因为它会使程序(在最坏的情况下,操作系统本身)处于不可靠状态(例如,如果终止的线程正在分配内存,如果它正在执行某些内核函数,操作全局共享 DLL 的状态)。

如果您想要更好/更安全的选择,您将需要一个具有严格内存和时序分区的实时操作系统。迄今为止,我还没有遇到任何关于具有这些特征的 Windows 和 unix 变体(甚至不是实时变体)的任何证实文档。有几个类似 unix 的系统(例如 LynxOS)具有具有此类属性的变体。

【讨论】:

  • 好的,谢谢。没想到这么复杂。
  • 是的,我确定。问题是,要支持您想要的内容,需要主机(操作系统)系统的非常特定的功能。哪个窗户没有。您可以使用一些功能,但您必须专门设计您的程序(功能)以适当地使用它们。并且描述如何做到这一点在这种格式下是行不通的。
  • 好的。感谢您的回复。我将等待一天,如果我没有得到更令人满意的答案,我会将您的答案标记为已接受。再次感谢!
  • 您不需要实时操作系统。在 Windows 上,只需使用 Asynchronous I/O,就可以收工了。这是安全的、单线程的,并且满足所有要求。
  • 异步 I/O 仅解决了部分问题,IInspectable。
【解决方案2】:

我认为使用多线程和带秒表的循环可以满足您的部分要求。

  1. 创建一个新线程。
  2. 启动秒表。
  3. 以一分钟为循环条件开始循环。
  4. 在每次迭代期间检查用户是否输入了输入和过程。
  5. 一分钟结束后,循环退出。

我不确定这个想法的可行性,只是分享了我的想法。我对 c++ 了解不多,但在 Node.js 中,您的要求可以使用“事件”来实现。可能C++中也存在这样的东西。

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多