7

たとえば、クラッシュしやすいコードを大量に実行する必要があるため、別のプロセスで実行する必要があります。通常、私は次のようにします。

  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アプリケーションでフォークを使用することはできますが、Qt4が提供するものや、多数のアーキテクチャに頼ることなくポータブルな方法で同じ機能をアーカイブできるかどうか疑問に思っています#ifdefs

いずれにせよ、私はこのアプリをpthread実装のみにすることを目標としていますが、それでも可能な限り「ネイティブ」QtAPIに近づけたいと思っています。

私はテストしましQThreadたが、スレッドでのsegfaultingは明らかにアプリケーション全体をクラッシュさせ、QProcess完全に異なる実行可能ファイルを生成する場合にのみ使用することを目的としているようです。他の選択肢はありますか?

4

4 に答える 4

7

Windowsフラットアウトには公的に消費可能な方法でfork()がないため、それをエミュレートするためのQt呼び出しはありません。特別なコマンドラインパラメータなどで自分自身を始めるようなことをする必要があります。

于 2009-06-09T00:13:59.310 に答える
3

Qtで利用可能なマルチスレッドプログラミング用の最も高レベルのAPIであるため、QtConcurrentを使用する必要があると思います。このようにして、コードはよりシンプルでクリーンになります。
これは高レベルのAPIであるため、すでに試した低レベルのAPIの上に実装されている可能性があります。ただし、これでは問題が解決しない可能性があります。

于 2009-06-09T00:10:39.160 に答える
1

試してみましたか...ステートメントをキャッチし、クラッシュを回避する方法を見つけましたか????

于 2009-06-08T21:37:23.043 に答える
0

QThreadも試してみてください。これは古く、おそらくQtConcurrentよりも便利ではありません。CPUのコア数を自動的に調整しないため、作業負荷が均等に分散されません。それでも、これはおそらくfork()に最も近いQtアナログですが、ドロップインの代替ではなく、より適切に機能する可能性があります。どちらもQThreadであり、QtConcurrentはプラットフォーム間で移植可能です。

于 2017-07-22T23:15:09.630 に答える