2

Qt コンソール アプリケーションを C で記述された別のコンソール アプリケーション (チェス エンジン - TSCP) と通信しようとしています。

私はこのクラスを作成しました:

#include "engine.h"

Engine::Engine(QObject *parent) :
    QProcess(parent)
{
}

Engine::~Engine()
{
    delete process;
}

void Engine::startProcess()
{
    process = new QProcess( this );

    process->setReadChannel( QProcess::StandardOutput );

    connect( process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError)) );
    connect( process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus)) );
    connect( process, SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()) );
    connect( process, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()) );
    connect( process, SIGNAL(started()), this, SLOT(started()) );
    connect( process, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(stateChanged(QProcess::ProcessState)) );

    //process->start( "/usr/bin/konsole --nofork -e ./TSCP" );
    process->start( "./TSCP" );
    process->waitForStarted(-1);
}

void Engine::stopProcess()
{
    //process->write( "bye" );
    process->closeWriteChannel();
}

void Engine::Write( QByteArray writeBuff )
{
    writeBuff.clear();
    qDebug() << "Sending command: " + writeBuff;
    process->write( writeBuff );
    //process->closeWriteChannel();
}

QByteArray Engine::Read()
{
    readBuffer = process->readAllStandardOutput();
    return readBuffer;
}

void Engine::error( QProcess::ProcessError error )
{
    qDebug() << "Error!";
    qDebug() << error;
}

void Engine::finished( int exitCode, QProcess::ExitStatus exitStatus )
{
    qDebug() << "The process has finished.";
    qDebug( "Exit code: %i", exitCode );
    qDebug( "Exit status: %i", exitStatus );
}

void Engine::readyReadStandardError()
{
    qDebug() << "Ready to read error.";
    qDebug() << process->readAllStandardError();
}

void Engine::readyReadStandardOutput()
{
    qDebug() << "The output:";
    readBuffer = process->readAllStandardOutput();
    qDebug() << readBuffer;
    //process->closeReadChannel( QProcess::StandardOutput );
    //process->waitForBytesWritten();
}

void Engine::started()
{
    qDebug() << "The process has started.";
}

void Engine::stateChanged( QProcess::ProcessState newState )
{
    switch( newState )
    {
    case 0:
        qDebug() << "The process is not running.";
        break;
    case 1:
        qDebug() << "The process is starting, but the program has not yet been invoked.";
        break;
    case 2:
        qDebug() << "The process is running and is ready for reading and writing.";
        break;
    }
}

私の main.cpp は次のようになります。

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "----------------------------------";

    Engine engine;
    engine.startProcess();
    engine.Write( "on" );
    qDebug() << "----------------------------------";

    return a.exec();
}

私は達成しようとしています:

  1. プロセスを開始します - チェスエンジン。
  2. プロセス - エンジンにコマンドを送信します。
  3. 回答を受け取る (表示できる、処理できる)。
  4. 通信を継続します(手順 2、3)。
  5. プロセスを閉じます。

最初と最後のステップに何の問題もありません - うまくいっています。問題は、チェス エンジン (コンソール アプリケーション) と正しく通信できないことです。

私は間違いなく何か間違ったことをしています!;) process->closeWriteChannel(); のコメントを外すと、void Engine::Write( QByteArray writeBuff ) 関数では、1 つのコメンド (たとえば、「オン」でゲームを開始) を記述し、正しい出力 (チェス エンジンからの応答 (移動)) を受け取ることができます。チャンネルが閉鎖されているため、次のコメンドを送信できません(それは明らかです)。この行がコメントされている場合、私は何の情報も受け取ることができません.

私はやりたい:

  1. プロセスを開始します。

    エンジン エンジン; engine.startProcess();

  2. 通信 (ユーザーを送信し、エンジンの動きを受信):

    engine.Write( "a2a3" ); engine.Write( "b2b3" ); engine.Write( "c2c3" );

  3. プロセスを閉じます。

答えを見つけるために最善を尽くしました(ヘルプ、グーグル)。解決策を見つけるのを手伝ってもらえますか?

ありがとうございました!

4

1 に答える 1

1

あなたのコードには 2 つの問題があります。

  1. メンバー関数を呼び出しwriteBuf.clear()ますがEngine::Write、そうしないでください。
  2. 外部プログラムは、改行文字を探してコマンドを区切っていると思います。のようなものを試してくださいengine.Write( "a2a3\n" )
于 2013-02-25T17:38:34.807 に答える