Files
GUI/src/StdOutRedirector.cpp
2021-11-19 13:20:17 +08:00

63 lines
1.3 KiB
C++

#include "StdOutRedirector.h"
#include <QTimer>
#include <QDebug>
StdOutRedirector::StdOutRedirector()
: QObject()
{
#ifdef __linux__
if (pipe(fdguistd) == -1)
printf("failed!");
#else
// Redirect
if (_pipe(fdguistd, 4096, _O_BINARY) == -1)
printf("failed!");
#endif
//int tr = fcntl(fdguistd, O_NONBLOCK);
// Duplicate stdout file descriptor (next line will close original)
fdStdOut = dup(fileno(stdout));
// Duplicate write end of pipe to stdout file descriptor
if (dup2(fdguistd[1], fileno(stdout)) != 0)
printf("failed!");
// Close original
close(1);
// Duplicate write end of original
dup2(fdguistd[1], 1);
}
StdOutRedirector::~StdOutRedirector()
{
}
void StdOutRedirector::readOutsToTF()
{
int n_out;
char* buffer = new char[4096];
QString str;
//char buffer[512];
//qDebug() << "from qdebug...";
//printf("from printf...\n");
//std::cout << "from std::cout..." << std::endl;
fflush(stdout);
//Perhaps there is a non-blocking version of _read() that you can call ?
n_out = read(fdguistd[0], buffer, 4096);
if (n_out <= 0)
return;
if (n_out >= 1) {
str.append(QString(buffer));
int con = str.lastIndexOf('\n');
int remv = str.at(con - 1) == '\n' ? 1 : 0;
if (con) {
str = str.remove(con - remv, str.length());
output->append(str);
}
}
}