Портативный способ "fork ()" в приложении Qt4? - PullRequest
7 голосов
/ 09 июня 2009

Скажем, мне нужно запустить кучу кода, склонного к сбою, поэтому мне нужно запустить его в другом процессе. Обычно я делаю это так:

  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);

Очевидно, что я могу просто использовать fork в своем приложении Qt4, но мне интересно, могу ли я заархивировать те же функции с помощью чего-либо, что предоставляет Qt4, или любым переносимым способом, не прибегая к связке архитектуры #ifdefs?

В любом случае, я нацеливаю это приложение на реализацию только pthread, но я все же хотел бы, чтобы все было как можно ближе к "нативному" Qt API.

Я протестировал QThread, и segfaulting в потоке, очевидно, приводит к аварийному завершению всего приложения, и кажется, что QProcess предназначен только для использования при создании совершенно разных исполняемых файлов. Любые другие альтернативы?

Ответы [ 4 ]

7 голосов
/ 09 июня 2009

В Windows не используется fork () каким-либо общедоступным способом, поэтому нет вызова Qt для его эмуляции; вам нужно что-то сделать, например, начать с специальных параметров командной строки или что-то в этом роде.

3 голосов
/ 09 июня 2009

Я думаю, вам следует использовать QtConcurrent , поскольку это самый высокоуровневый API для многопоточного программирования, доступный в Qt. Таким образом, ваш код будет более простым и понятным.
Поскольку это высокоуровневый API, он, вероятно, реализован поверх низкоуровневых API, которые вы уже пробовали, однако, возможно, это не решит вашу проблему.

1 голос
/ 09 июня 2009

Вы пробовали попробовать ... поймать заявления и выяснить, как избежать сбоев ????

0 голосов
/ 23 июля 2017

Вы также можете попробовать QThread . Он старше и, предположительно, менее удобен, чем QtConcurrent. Он не подстраивается автоматически под число ядер на процессоре и, следовательно, не распределяет нагрузку равномерно. Тем не менее, это, вероятно, ближайший аналог Qt для fork (), хотя он не является заменой и может работать лучше для вас. Оба типа QThread и QtConcurrent являются переносимыми для всех платформ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...