2017-06-26 2 views
0

こんにちは人々はあなたの助けを必要とするか、QtやC++ですることができます、私はプロセスを作成したいのですが、私のプログラムの機能を外部プログラムではなく、このようなものを使用するプロセス....例と許して申し訳ありません私の英語の感謝C++またはQtでプロセスを作成するにはどうすればよいですか?

void count(){blablabla} 
int main(){QProcess p = new QProcess(count());p.start();} 
+2

*プロセス*にする必要がありますか? *スレッド*できませんか? –

+0

はいはいプロセスは可能ですか? – logancale2016

+0

はい、可能ですが、面倒です。基本的には、呼び出したい関数を呼び出すように指示する特殊な引数を使用して、独自のプログラム(独自の実行可能プログラムを起動する)を実行するプロセスを作成する必要があります。また、スレッドは、ほとんどのプラットフォームではプロセスがメモリを共有しないことを覚えておいてください。 –

答えて

0

IMHO、最も簡単な方法は、スレッドを使用することです。スレッドを使用することに唯一異論があるのは、スレッドが終了するということだけであれば、プロセスを終了する前にスレッドが終了するのを待って、スレッドを終了させることができます。

void doSomething(); 

int main (int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    ... 
    // Start a doSomething() in another thread using pure C++11 
    std::thread cppThread(&doSomething); 
    // The same using Qt 
    QFuture<void> qtThreadResult = QtConcurrent::run(&doSomething); 
    ... 
    int r = app.exec(); 
    ... 
    // The Qt application is closed 
    // We wait for the thread to complete 
    cppThread.join(); 
    // The same using Qt 
    qtThreadResult.waitForFinished(); 

    // Everything is finished, we can exit 
    return r; 
} 

あなたは絶対にあなたが2つのソリューションを持っている別のプロセスを作成する必要があり、どちらかが2つのプログラムAとBを作成し、あなたがAからBを開始するか、あなたは、単一のプログラムを持っているし、あなたが提供する必要がある場合コマンドライン引数は、その動作を変更することができます。

void doSomething(); 

int main (int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    if (app.arguments().contains("--foo")) 
    { 
     doSomething(); 
     return 0; 
    } 
    else 
    { 
     return app.exec(); 
    } 
} 

あなたは、その後のQtを使用して新しいプロセスを起動することができます

QProcess::startDetached("B"); 
QProcess::startDetached("A --foo"); 
QProcess::startDetached(QCoreApplication::applicationFilePath(), QStringList{"--foo"}); 

純粋なC++を使用して、それは少し複雑になります。すべてのプラットフォームでsystem()がありますが、作成したプロセスを操作する必要がある場合は、多くのオプションがありません。次に、Linuxではexecl()(& co。)、WindowsではCreateProcess()などのプラットフォーム固有のソリューションがあります。

また、2つのプロセス間でデータを共有する必要がある場合、これはさらに複雑になります。あなたは共有メモリやソケットやパイプやstdin/stdoutで遊ぶ必要があります。

+0

私はそれが私にとって良いと思うよ – logancale2016

+0

ええ、どうもありがとう – logancale2016

0

QTimerを使うことができます。これは一定の間隔でtimeout()シグナルを出します。 1秒タイマ、

QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(count())); 
    timer->start(1000); 

ため 例その時から、カウント数()スロットは毎秒と呼ばれています。 QTimer

関連する問題