2016-05-06 60 views
1

プロセス名を設定するQProcessのメンバ関数が完全なパスを必要とするため、別のプロセスでアプリケーションの異なる部分を実行する方法については、この問題に直面しています。C++ Qt別のプロセスでアプリケーションの一部を実行する

void setProgram(const QString &program) 

しかし、私が実行しようとしているプロセスは基本的にメインアプリケーションのモジュールです。だから私が基本的に達成しようとしていることを説明しましょう。

アプリケーションには、すべての異なるモジュールを制御し、監視し、停止/再起動し、IPCメカニズムを介してそれらと通信する中央ウィンドウとしてQMainWindowがあります。例えばので

  1. モジュールの1つは、特定のWebサイトにユーザーを指示し、そのユーザのセッション情報(クッキー、認証、など)を管理しますQWebEngineViewを持っており、ユーザーは、彼のようなウェブサイトを使用できるようになります通常はブラウザ経由で行われます。
  2. もう1つのモジュールは、アプリケーションの一部をブロックすることなく、CPU集中型の計算を連続して実行します。
  3. 別のモジュールは、本格的なJavascriptチャート作成アプリケーションをレンダリングします。

など。このような重いモジュールは多数あり、基本的にこれらのモジュールを別々のメモリ空間で実行する必要があり、MainWindowプロセスの子プロセスとして動作するため、スレッド化アプローチは望ましくありません。プロセス間の通信は、D-Bus、SharedMemoryを使用してうまく処理されます。

しかし私が理解できないのは、ユーザーがMainWindowの特定のアクション/ボタンをクリックしたときにこれらの子プロセスを実際に作成する方法です。これらのモジュールは、1つのアプリに非常に統合されており、セキュリティと整合性の制約のために外部から呼び出すことはできません。だから私にこれを達成する方法を教えてください。

+0

独立したアプリケーションとして別々のモジュールをコンパイルし、実行時にそれらを一時ファイルとして書き出して実行することが、すばやく簡単です。 – Marco

+0

それをきれいにして複雑にしたいなら(そしておそらくクロスプラットフォームではない)、私はこれを見ていきます:http://www.rohitab.com/discuss/topic/31681-c-run-program-from-memory- and-not-file/ – Marco

+0

これは、別のスレッドの関数を実行するのと同じように、メモリからプログラムやサブモジュールを実行するという考えです。しかし、これはLinux専用のアプリであり、Windows上では決して動かないので、私はLinux固有の解決策を探していました。 – Maxx

答えて

2

1つの方法は、同じ実行可能ファイルを使用し、コマンドライン引数を使用して起動するモジュールを制御することです。簡単な例をthis answerでご覧ください。プロセス間通信はローカルソケットを使用して行うことができ、プロセス間でスロットコールを送信することもできます。 CuteIPC

+0

これはfork()システムコールを使用するのではなく、アプリケーション全体がQProcessに準拠していることを保証する最も論理的で簡単な方法です。ご回答有難うございます。 – Maxx

関連する問題