2009-06-08 16 views
6

Dire, ho bisogno di eseguire un gruppo di codice che è soggetto a crash, quindi ho bisogno di eseguirlo su un processo diverso. In genere lo farei in questo modo:Modo portatile per "fork()" nell'applicazione 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); 

Ovviamente posso solo usare forchetta nella mia applicazione Qt4 ma mi chiedo se posso archiviare stessa funzionalità con qualsiasi cosa che Qt4 fornisce o qualsiasi modo portatile senza ricorrere alla avendo un mucchio di architettura #ifdefs?

In ogni caso, ho scelto questa app per avere solo l'implementazione pthread, ma mi piacerebbe comunque mantenere le API Qt più vicine alle API "native" il più possibile.

Ho testato QThread e il segfaulting nel thread interrompe l'intera applicazione in modo evidente e sembra che lo QProcess sia utilizzato solo quando si generano file eseguibili completamente diversi. Qualche altra alternativa?

+3

Sai che c'è un forum Qt su http://qtcentre.org? Puoi anche chiedere sul canale #qt su irc.freenode.net nel caso in cui tu non abbia la tua risposta qui. –

+0

Ho provato a cercare possibili esempi dal wiki di qtcentre ma non ne ho trovato nessuno, mi occuperò di #qt più tardi oggi propably =) – rasjani

risposta

7

Windows flat-out non ha fork() in alcun modo di consumo pubblico, quindi non c'è alcuna chiamata Qt per emularlo; dovrai fare qualcosa come iniziare da te con parametri speciali da linea di comando o qualcosa del genere.

+0

Si noti che esiste un modo per emulare 'fork()' su Windows. Cygwin lo fa. Tuttavia, è piuttosto complicato e lento (copia solo l'intera memoria). Quindi, il modo migliore è probabilmente spostare il codice in un'applicazione di supporto aggiuntiva che è possibile eseguire in un sottoprocesso. O per avviare la stessa app con parametri speciali della riga di comando come suggerito. – Albert

1

Hai provato a provare ... prendere dichiarazioni & capire come evitare di schiantarsi ????

+1

Scusate ma non è un'opzione, il codice che si blocca * dovrebbe * crash solo se vuole e la mia applicazione dovrebbe prenderlo e continuare a ticchettare senza schiantarsi. – rasjani

+2

Provare a catturare AV e inghiottirli è una vulnerabilità di sicurezza enorme –

3

Penso che dovresti andare con QtConcurrent in quanto è l'API di livello più alto per la programmazione multithread disponibile in Qt. In questo modo il tuo codice sarà più semplice e più pulito.
Poiché si tratta di un'API di alto livello, probabilmente è implementata in aggiunta alle API di livello inferiore che hai già provato, quindi probabilmente questo problema potrebbe non risolvere il problema.

0

Si potrebbe provare anche QThread. È più vecchio e presumibilmente meno conveniente di QtConcurrent. Non si regola automaticamente per il numero di core su una CPU, e quindi non distribuisce il carico di lavoro in modo uniforme. Tuttavia, è probabilmente l'analogo Qt più simile a fork(), anche se non è una sostituzione drop-in, e potrebbe funzionare meglio per voi. Entrambi sono QThread e QtConcurrent sono portabili su piattaforme diverse.