【问题标题】:Portable way to "fork()" in Qt4 application?Qt4 应用程序中“fork()”的便携方式?
【发布时间】:2009-06-08 21:33:45
【问题描述】:

比如说,我需要运行一堆容易崩溃的代码,所以我需要在不同的进程上运行它。通常我会这样做:

  pid = fork();
  if (pid == -1) {
    std::cout << "Cant Spawn New Thread";
    exit(0);
  } else if (pid == 0) {
    std::cout << "Im a child that will crash\n";
    char *foo = (char *) 0xffff;
    std::cout << foo;
    exit(0);
  } else {
    std::cout << "PID:  " << pid << "\n";
  }
  do {
    std::cout << "Waiting for " << pid << "  to finish .. \n";
    pid_w = waitpid(pid,&status,0);
  } while (pid_w == -1);

显然,我可以在我的 Qt4 应用程序中使用 fork,但我想知道是否可以使用 Qt4 提供的任何东西或任何可移植方式归档相同的功能,而无需求助于拥有一堆架构 #ifdefs

无论如何,我的目标是这个应用程序只有 pthread 实现,但我仍然希望尽可能接近“原生”Qt API。

我已经测试了QThread,并且线程中的段错误显然会使整个应用程序崩溃,而且似乎QProcess 仅在生成完全不同的可执行文件时使用。还有其他选择吗?

【问题讨论】:

  • 你知道qtcentre.org有一个Qt论坛吗?您也可以在 irc.freenode.net 上的#qt 频道上提问,以防万一您在这里没有得到答案。
  • 我确实尝试从 qtcentre 的 wiki 搜索可能的示例,但没有找到任何示例,我将在今天晚些时候访问 #qt =)

标签: c++ qt qt4 fork


【解决方案1】:

Windows flat-out 没有任何可公开使用的 fork(),因此没有 Qt 调用来模拟它;你需要做一些事情,比如使用特殊的命令行参数或其他东西开始自己。

【讨论】:

  • 请注意,有一种方法可以在 Windows 上模拟 fork()。 Cygwin 就是这样做的。然而,这是相当复杂和缓慢的(它只是复制整个内存)。因此,更好的方法可能是将代码移到一个额外的帮助应用程序中,然后您可以在子进程中执行该应用程序。或者按照建议使用特殊的命令行参数启动同一个应用程序。
【解决方案2】:

我认为您应该使用QtConcurrent,因为它是 Qt 中用于多线程编程的最高级别 API。这样您的代码会更简单、更干净。
由于这是一个高级 API,它可能是在您已经尝试过的低级 API 之上实现的,因此这可能无法解决您的问题。

【讨论】:

    【解决方案3】:

    您是否尝试过 try...catch 语句并弄清楚如何避免崩溃????

    【讨论】:

    • 对不起,但它不是一个选项,崩溃的代码应该只要它愿意就崩溃,我的应用程序应该抓住它并继续滴答作响而不会崩溃。
    • 试图捕获 AV 并吞下它们是一个巨大的安全漏洞
    【解决方案4】:

    你也可以试试QThread。它比 QtConcurrent 更老,而且可能不太方便。它不会自动调整 CPU 上的内核数量,因此不会均匀地分配工作负载。尽管如此,它可能是最接近 fork() 的 Qt 模拟,尽管它不是直接替代品,并且可能更适合您。两者都是 QThread 和 QtConcurrent 都可以跨平台移植。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      相关资源
      最近更新 更多