当前位置: 代码迷 >> QT开发 >> Qprocess中,主历程向子进程发送消息,子进程无法收到
  详细解决方案

Qprocess中,主历程向子进程发送消息,子进程无法收到

热度:8   发布时间:2016-04-25 04:24:11.0
Qprocess中,主进程向子进程发送消息,子进程无法收到
用Ruby写的程序,
进程是UI界面:
@pro = Qt::Process.new()

connect(@pushButton_1, SIGNAL('clicked()'),self, SLOT('handle_clicked()'))
connect(@pushButton_3, SIGNAL('clicked()'),self, SLOT('sendToClient()'))
connect(@pro, SIGNAL('readyReadStandardOutput()'),SLOT('readResult()'))
connect(@pro, SIGNAL('finished(int,QProcess::ExitStatus)'),SLOT('finished()'))

def sendToClient
number = @pro.write(@lineEdit_1.text())
puts number
end

def handle_clicked
@pro.start("ruby test1.rb")
end

def finished
@textEdit.append("后台程序运行结束。")
end

def readResult
data = @pro.readAllStandardOutput()
@textEdit.append(data.to_s.chomp!)
end
点击按钮1,开启子进程pro,点击按钮2,把lineEdit_1里的值通过write()传送给pro。
绑定信号和槽,子进程中有标准输出时,输出到主进程的textEdit中。

子进程:
puts "后台程序正在运行1..."
STDOUT.flush

f1 = File.new('1.txt','w')
f2 = File.new('2.txt','w')

STDOUT.puts "请输入用户名(首次登陆即为注册,用户名长度不超过20个字符。):"
STDOUT.flush

user_name = STDIN.gets.chomp
f1.puts user_name


STDOUT.puts "请输入密码(密码长度不超过16个字符)"
STDOUT.flush

password = STDIN.gets.chomp
f2.puts password

问题如下:现在可以实现,主进程接收子进程的标准输出,然后点击按钮后,向子进程发送用户名,子进程收到用户名,但是收到之后的"请输入密码(密码长度不超过16个字符)"却无论如何也无法输出,加了向文件中的写操作后发现,只有1.txt被写入了,而且子进程是不停的接收user_name ,比如点击了3次按钮,发送了三个字符串向子进程,子进程退出后,一股脑的向1.txt中写了3个字符串。
其实就是子进程停止在
user_name = STDIN.gets.chomp
f1.puts user_name
这两行里了,貌似在循环读取。

一个下午加晚上都不知道问题出在哪里,麻烦大家帮我看看,感激不尽。
------最佳解决方案--------------------
如果子进程是控制台程序,仔细想想哪里的问题?
控制台程序输入一行字符串之后要“按回车”完成输入。
向QProcess写入的时候每行末尾要有回车符“\n”;
------其他解决方案--------------------
引用:
如果子进程是控制台程序,仔细想想哪里的问题?
控制台程序输入一行字符串之后要“按回车”完成输入。
向QProcess写入的时候每行末尾要有回车符“\n”;


谢谢您的耐心解答,这个可能是初学者很容易犯的错误,我曾经想过,我以为Qt的write()会像Ruby一样加入一个回车,我按您说的改了一下,果然就成功了。

再次感谢~~