我正在使用Qprocess执行ping以检查主机是否在线...
问题是,无论是ping可达主机还是无法访问的主机,我从Qprocess->完成信号中接收的退出代码总是2.
我一直在QTimer中ping一个主机(我在Qt应用程序运行的客户端安装了一个文件夹)...
当我在连接到QProcess->完成信号的插槽中捕获ping返回的退出代码时,我总是收到退出代码为2 ..
我不能通过系统(ping)使用直接系统调用,因为它挂起我的应用程序ping时间是活动的...我希望它是异步的所以我切换到QProcess ...
以下是代码段:
//Pinging function called inside a timer with timout 1000
QString exec="ping";
QStringList params;
if(!dBool)
{
//params << "-c1 1.1.1.11 -i1 -w1;echo $?";
params <<" 1.1.1.11 -i 1 -w 1 -c 1";//wont ping
cout<<"\n\npinging 11 ie wont ping";
}
else
{
//params << "-c1 1.1.1.1 -i1 -w1;echo $?";
params <<" 1.1.1.1 -i 1 -w 1 -c 1";//will ping
cout<<"\n\npinging 1 ie will ping";
}
ping->start(exec,params);
// the slot that connects with QProcess->finished signal …
Run Code Online (Sandbox Code Playgroud) 我尝试启动Internet Explorer,所以我使用下面的代码
QProcess * process=new QProcess(this);
QString temp="C:\\Program Files\\Internet\ Explorer\\iexplore.exe";
process->startDetached(temp.toStdString().c_str());
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我正在使用QProcess对象列表来跟踪需要以用户定义的间隔启动/停止的某些进程.
我能够启动和停止进程.但是当我使用以下方法(伪代码)停止进程时会出现问题:
process->start("PathToProcess","Some Arguments");
//Do some stuff.
process->terminate();
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在另一个时间再次启动该过程,我会收到错误:
QProcess::start: Process is already running
Run Code Online (Sandbox Code Playgroud)
我可以做一个ps -ef | grep processName并发现它确实已经死了,但是它处于一个已经不存在的状态,我认为这会阻止我再次启动它.
我需要做些什么来防止这种失效状态,或者删除失效方法,以便我可以重新开始我的过程而不重建?
我有一个函数A()
,我执行其他八个'子函数',其中包括一个QProcess
.如何从所有QProcesses获取返回代码?
例:
void Mainclass::A()
{
B();
C();
// ...
I();
}
void Mainclass::B()
{
QString CommandPath = "PathB";
QProcess *Process = new QProcess(this);
Process->setWorkingDirectory(MainDir);
Process->setStandardOutputFile(MainDir + "/geometries");
Process->start(CommandPath);
Process->waitForFinished();
QProcess::ExitStatus Status = Process->exitStatus();
if (Status == 0)
{
std::cout << "App executed!" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了这个例子,但是我不了解如何自己实现它,因为我在我的应用程序中使用指针对象.
我是qt开发的新手,我想将QProcess的输出实时传输到textBrowser.我开始执行一个简单的echo命令,但程序的输出没有显示出来.我究竟做错了什么????
QProcess p;
p.start("echo hye");
QByteArray byteArray = p.readAllStandardOutput();
QStringList strLines = QString(byteArray).split("\n");
QString line= p.readAllStandardOutput();
if(p.state()==QProcess::NotRunning)
ui->textBrowser->append("not running");
foreach (QString line, strLines){
ui->textBrowser->append(line);}
Run Code Online (Sandbox Code Playgroud)
PS我在linux机器上.
编辑:我仍然无法在textBrowser中获取输出.
我更改了Qprocess参数并尝试了waitForStarted()和waitForReadyRead(),以便进程及时启动并且结果可用.
我添加了waitForFinished(),以便当进程超出范围时进程不会终止.
QProcess p;
p.start("echo", QStringList() << "hye");
p.waitForStarted();
QByteArray byteArray = p.readAllStandardOutput();
QStringList strLines = QString(byteArray).split("\n");
QString line= p.readAllStandardOutput();
if(p.state()==QProcess::NotRunning)
ui->textBrowser->append("not running");
ui->textBrowser->append(line);
p.waitForFinished();
Run Code Online (Sandbox Code Playgroud) 我使用QProcess并将它的readyReadStandardOutput连接到插槽.但是在启动插槽后执行两次.请告诉我,为什么?
{
myProcess = new QProcess(parent);
myProcess->start("mayabatch.exe -file "+scene);
connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
}
void MainWindow::readOutput()
{
qDebug()<<"Read";
QByteArray outData = myProcess->readAllStandardOutput();
qDebug()<<QString(outData);
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
Read
"File read in 0 seconds.
"
Read
"cacheFi"
Read
"le -attachFile -fileName "nClothShape1" -directory ...
Run Code Online (Sandbox Code Playgroud)
最后一个字符串坏了.单词之间出现"Read".
我对MacOS很陌生,我觉得使用Terminal很容易ffmpeg
就像在Window上一样正常运行.
我从http://ffmpegmac.net获得了ffmpeg二进制文件,我尝试在终端中运行可执行文件,它告诉命令没有找到?我现在可以运行它的唯一方法是使用命令:"open ffmpeg"
,但这样终端在另一个窗口中打开,这不是我所期待的.
有没有办法直接在终端中调用ffmpeg(就像在Windows cmd上运行一样)或者我错过了什么?
我必须构建一个小对话框,创建一个文件夹的符号链接.
在Windows中我会使用mklink/D命令.
是否有可能在Qt中创建此类链接?我只看到QFile在文件之间创建链接,并且他们需要以.lnk结尾(http://qt-project.org/doc/qt-4.8/qfile.html#link)另一方面QDir没有提供任何内容.
有什么建议?
最好的问候,理查德
文档QProcess.pid()
说:
如果可用,返回正在运行的进程的本机进程标识符.如果当前没有进程正在运行,则返回0.
这是什么意思?
这段代码用来解释我的困惑.我使用的是Python 2.7.9,PyQt 4和Windows 7:
import sys, os, time
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class testLaunch(QWidget):
def __init__(self):
QWidget.__init__(self)
self.process = QProcess(self)
self.process.start('calc')
self.process.waitForStarted(1000)
print "PID:", int(self.process.pid())
if __name__ == "__main__":
app = QApplication(sys.argv)
main = testLaunch()
main.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
这将按预期启动Windows计算器应用程序.在任务管理器中,它显示以下内容:
这显示我的PID为8304. print
虽然我的申请中的声明显示:
PID: 44353984
Run Code Online (Sandbox Code Playgroud)
这代表了什么?它与任务管理器报告的8304 PID相比如何?
我有一个主要的pyqt程序,需要运行带有参数的外部程序。我想将QDialog用作一种状态监视器,它将在执行外部程序时捕获外部程序的标准输出,并将其显示在QDialog内的文本框中。我有以下状态监视器代码:
class ProgressInfo(QtGui.QDialog):
def __init__(self, cmd, args, parent=None):
#super(self).__init__(parent)
QDialog.__init__(self)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.cmd = cmd
self.args = args
self.keepGoing = True
layout = QFormLayout()
layout.setContentsMargins(10, 10, 10, 10)
self.output = QtGui.QTextEdit()
layout.addRow(self.output)
layout.addRow(self.ui.buttonBox)
self.setLayout(layout)
self.ext_process = QtCore.QProcess(self)
#self.ext_process.waitForFinished(-1)
#self.ext_process.waitForStarted()
#self.ext_process.readyRead.connect(self.dataReady)
self.ext_process.started.connect(self.open)
self.ext_process.readyReadStandardOutput.connect(self.dataReady)
self.ext_process.finished.connect(self.onProcessFinished)
self.ext_process.start(self.cmd, self.args)
def dataReady(self):
cursor = self.output.textCursor()
cursor.movePosition(cursor.End)
cursor.insertText(str(self.ext_process.readAll()))
self.output.ensureCursorVisible()
def onProcessFinished(self):
cursor = self.output.textCursor()
cursor.movePosition(cursor.End)
#cursor.insertText(str(self.ext_process.readAll()))
cursor.insertText(str(self.ext_process.readAllStandardOutput()))
self.output.ensureCursorVisible()
Run Code Online (Sandbox Code Playgroud)
然后,我将使用以下命令实例化该命令:
prog='C:/Program Files (x86)/My Program/Execute.exe'
margs=['D:/Data/Input1.txt', 'D:/Data/Input2.txt']
status = ProgressInfo(prog, margs, self)
Run Code Online (Sandbox Code Playgroud)
到目前为止,这还没有奏效。
问题1:仅在取消注释waitForFinished(-1)行之后,外部程序才会运行。
问题2。QDialog框仅在一瞬间打开,然后消失。
问题3.显然,没有显示正在运行的程序的任何异常。 …