Question

Say, I need to run a bunch of code that is prone to crash so I need to run it on a different process. Typically I'd do it like this:

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

Obviously I can just use fork in my Qt4 application but I'm wondering if can I archive same functionality with any anything that Qt4 provides or any portable manner without resorting to having bunch of architecture #ifdefs ?

In any case, I'm targeting this app to have only pthread implementation but I'd still like to keep things as much close to "native" Qt API as possible.

I've tested QThread, and segfaulting in thread crashes the whole application obviously and it seems that QProcess is only targetted to be used when spawning completely different executables. Any other alternatives ?

Was it helpful?

Solution

Windows flat-out doesn't have fork() in any publicly consumable way, so there's no Qt call to emulate it; you'll need to do something like start yourself with special command-line params or something.

OTHER TIPS

I think you should go with QtConcurrent as it's the most high-level API for multithreaded programming available in Qt. This way your code will be more simple and cleaner.
As this is a high-level API it's probably implemented on top of lower-level APIs you already tried so this probably may not solve your problem, however.

Have you tried try...catch statements & figuring out how to avoid crashing????

You might try QThread also. It is older, and presumably less convenient than QtConcurrent. It does not adjust automatically for the number of cores on a CPU, and thus does not distribute the work-load as evenly. Still, it is probably the closest Qt analog to fork(), although it is not a drop-in replacement, and may work better for you. Both are QThread and QtConcurrent are portable across platforms.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top