2009-06-08 16 views
6

Digamos, necesito ejecutar un montón de código que es propenso a fallar, así que necesito ejecutarlo en un proceso diferente. Normalmente lo haría así:forma portátil de "tenedor()" en la aplicación Qt4?

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

Obviamente sólo puedo usar tenedor en mi solicitud Qt4 pero me pregunto si puedo archivar misma funcionalidad con cualquier cosa que ofrece Qt4 o cualquier forma portátil sin tener que recurrir a tener un montón de arquitectura #ifdefs?

En cualquier caso, apuntaré a esta aplicación para tener solo la implementación pthread, pero me gustaría mantener las cosas lo más cercanas posible a la API Qt "nativa".

He probado QThread, y segfaulting en el hilo bloquea la aplicación completa obviamente y parece que QProcess solo está destinado a ser utilizado al generar completamente diferentes ejecutables. ¿Alguna otra alternativa?

+3

¿Sabes que hay un foro de Qt en http://qtcentre.org? También puede preguntar en el canal #qt en irc.freenode.net. En caso de que no obtenga su respuesta aquí. –

+0

Intenté buscar posibles ejemplos de la wiki de qtcentre pero no encontré ninguno, pasaré por #qt más tarde hoy propably =) – rasjani

Respuesta

7

Windows flat-out no tiene fork() de ninguna manera pública, por lo que no hay Qt para emularlo; tendrás que hacer algo como iniciarte con params de línea de comando especial o algo así.

+0

Tenga en cuenta que hay una forma de emular 'fork()' en Windows. Cygwin hace eso. Sin embargo, eso es bastante complicado y lento (simplemente copia toda la memoria). Entonces, la mejor manera es probablemente mover el código a una aplicación auxiliar adicional que luego puede ejecutar en un subproceso. O para iniciar la misma aplicación con params de línea de comandos especiales como se sugiere. – Albert

1

¿Has intentado intentar ... detectar declaraciones & averiguar cómo evitar colisiones? ???

+1

Lo siento, pero no es una opción, el código que se bloquea * debería * simplemente fallar si quiere y mi aplicación debería simplemente atrapar eso y seguir corriendo sin que se cuelgue. – rasjani

+2

Intentar capturar AV y tragarlos es una vulnerabilidad de seguridad masiva –

3

Creo que debería ir con QtConcurrent, ya que es la API de más alto nivel para la programación multiproceso disponible en Qt. De esta manera, su código será más simple y más limpio.
Como se trata de una API de alto nivel, probablemente se implemente sobre las API de nivel inferior que ya probaste, por lo que es probable que esto no solucione tu problema.

0

También puede probar QThread. Es más antiguo, y presumiblemente menos conveniente que QtConcurrent. No se ajusta automáticamente para la cantidad de núcleos en una CPU y, por lo tanto, no distribuye la carga de trabajo de manera uniforme. Aún así, es probablemente el análogo de Qt más cercano a fork(), aunque no es un reemplazo directo, y puede funcionar mejor para usted. Ambos son QThread y QtConcurrent son portátiles en todas las plataformas.