<HTML>
<HEAD>
<TITLE>Re: [PyQt] Avoiding freeze of the application</TITLE>
</HEAD>
<BODY>
<FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>If you don&#8217;t want to use QProcess, you can use subprocess.Popen and the poll() method.<BR>
<BR>
This would be something like:<BR>
<BR>
popen = &nbsp;Subprocess.Popen(&quot;plink -batch %s@%s echo&quot; %<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'> (self.beqLineEdit.text(), self.linuxmachineComboBox.currentText())<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, shell=True<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, stderr=errptr)<BR>
<BR>
</SPAN></FONT></BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>And in some QTimer bound method:<BR>
<BR>
retcode = popen.poll()<BR>
if retcode is not None:<BR>
&nbsp;&nbsp;# process has finished<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'><BR>
<BR>
</SPAN></FONT></BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>QProcess is nice because it already has a signal that it sends when the process terminates. &nbsp;subprocess.Popen also has some quirks like you can&#8217;t use poll.wait or os.wait and popen.poll at the same time.<BR>
<BR>
Brian<BR>
<BR>
<BR>
On 2/7/09 11:00 AM, &quot;Phil Thompson&quot; &lt;<a href="phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>&gt; wrote:<BR>
<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>On Sat, 07 Feb 2009 16:53:27 +0100, Geert Vancompernolle<BR>
&lt;<a href="geert.discussions@gmail.com">geert.discussions@gmail.com</a>&gt; wrote:<BR>
&gt; Hi,<BR>
&gt;<BR>
&gt; I want to achieve the following:<BR>
&gt;<BR>
&gt; * My (Windows) application is trying to make a connection with a Linux<BR>
&gt; server, using another application (plink, part of the Putty distro)<BR>
&gt; * Since an external application is to be called, I'm using the method<BR>
&gt; subprocess in this way:<BR>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retcode = subprocess.call( &quot;plink -batch %s@%s echo&quot; %<BR>
&gt; (self.beqLineEdit.text(), self.linuxmachineComboBox.currentText())<BR>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, shell=True<BR>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, stderr=errptr<BR>
&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<BR>
&gt; * However, that call can take up to 10 seconds (worst case). &nbsp;In the<BR>
&gt; mean time, my main application is &quot;frozen&quot;, I can't do anything else.<BR>
&gt;<BR>
&gt; Now, what I would like to do, is to decouple the above call from the<BR>
&gt; main thread, such that the main application becomes &quot;free&quot; again. &nbsp;I<BR>
&gt; also would like to start a one shot timer (using QTimer.singleShot()) to<BR>
&gt; create a time-out. &nbsp;This is to prevent a &quot;hang&quot; of the application, in<BR>
&gt; case something goes wrong during the subprocess call.<BR>
&gt;<BR>
&gt; So, my intention is to check when the one shot timer elapses, if the<BR>
&gt; subprocess call is still busy. &nbsp;If not, then all is fine and I simply<BR>
&gt; ignore the time out. &nbsp;If the subprocess is still busy, I would like to<BR>
&gt; be able to (if needed, forcefully) stop the subprocess call.<BR>
&gt;<BR>
&gt; I currently started the one shot timer just before I launched the<BR>
&gt; subprocess call, but I see that the one shot timer is also blocked by<BR>
&gt; the subprocess call. &nbsp;So, that doesn't do what I in fact want to do.<BR>
&gt;<BR>
&gt; My questions:<BR>
&gt;<BR>
&gt; 1. How can I &quot;decouple&quot; the subprocess call?<BR>
&gt; 2. How can I forcefully stop a subprocess call (that should be the case<BR>
&gt; if my one shot timer elapses after 10 seconds, and the subprocess call<BR>
&gt; is not returned yet)?<BR>
&gt; 3. What's the best approach to achieve the above requirements? &nbsp;Using a<BR>
&gt; kind of a state machine, where I first start the subprocess call<BR>
&gt; (decoupled), then start the one shot timer, change the state and then<BR>
&gt; check in that state if the subprocess call has indeed ended? &nbsp;And if<BR>
&gt; not, forcefully stop the subprocess call?<BR>
&gt;<BR>
&gt; Any practical helpful tips much appreciated!<BR>
<BR>
Use QProcess instead of subprocess.<BR>
<BR>
Phil<BR>
_______________________________________________<BR>
PyQt mailing list &nbsp;&nbsp;&nbsp;<a href="PyQt@riverbankcomputing.com">PyQt@riverbankcomputing.com</a><BR>
<a href="http://www.riverbankcomputing.com/mailman/listinfo/pyqt">http://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><BR>
<BR>
</SPAN></FONT></BLOCKQUOTE>
</BODY>
</HTML>