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();
}
私は達成しようとしています:
- プロセスを開始します - チェスエンジン。
- プロセス - エンジンにコマンドを送信します。
- 回答を受け取る (表示できる、処理できる)。
- 通信を継続します(手順 2、3)。
- プロセスを閉じます。
最初と最後のステップに何の問題もありません - うまくいっています。問題は、チェス エンジン (コンソール アプリケーション) と正しく通信できないことです。
私は間違いなく何か間違ったことをしています!;) process->closeWriteChannel(); のコメントを外すと、void Engine::Write( QByteArray writeBuff ) 関数では、1 つのコメンド (たとえば、「オン」でゲームを開始) を記述し、正しい出力 (チェス エンジンからの応答 (移動)) を受け取ることができます。チャンネルが閉鎖されているため、次のコメンドを送信できません(それは明らかです)。この行がコメントされている場合、私は何の情報も受け取ることができません.
私はやりたい:
プロセスを開始します。
エンジン エンジン; engine.startProcess();
通信 (ユーザーを送信し、エンジンの動きを受信):
engine.Write( "a2a3" ); engine.Write( "b2b3" ); engine.Write( "c2c3" );
プロセスを閉じます。
答えを見つけるために最善を尽くしました(ヘルプ、グーグル)。解決策を見つけるのを手伝ってもらえますか?
ありがとうございました!