On 09/01/2013 18:03, David Cortesi wrote:
The doc for QThread.terminate() says its use "is discouraged".

I have a thread that calls urllib2 to read an http page. I am having a problem
where this thread gets hung somewhere in the urllib2 -- remains to be
determined whether in urllib2.urlopen() or in a read() on the resulting object.

Anyway, I am thinking of implementing a Kill button so the main thread can
stop and recreate the worker threadin case of such a hang. But am puzzled on
several points:

1. Would .terminate of a QThread that is hung within a python lib, actually
achieve anything, i.e. break out of the python hang?

Think so. But if the main thread is waiting on the 2nd thread? It may not have the chance to release mutexes/notify condition variables.

2. If it did exit the python lib code, would it be likely to leave python
itself (or PyQt or Sip) in some bad indeterminate state that would cause
further problems, e.g. when the thread is recreated and calls back into urllib2?

I think that QThread.terminate() maps directly on QThread::terminate, right? If so, on unixes the QThread::terminate means pthread_cancel. Have a look at the man page. A quick look at qt 4.7.0 sources says that cancellation is enabled by default (src/corelib/thread/qthread_unix.cpp) but nothing calls pthread_setcanceltype -> cancellation is deferred at cancellation points. Indeterminate state for sure, but this may mean nothing if there's no data shared between threads and the library itself has no internal state.

3. What about QThread.exit() -- I can't figure out if it is meant for calling
from within the thread's code, or from outside it? Would it be of use in a
"kill" situation?

AFAIK can be called anywhere. It just tells the event loop to exit cleanly. If the event loop does not get called because i.e. the thread is blocked in an IO operation this call apparently does nothing.

--
            Giuseppe Corbelli
WASP Software Engineer, Copan Italia S.p.A
Phone: +390303666318  Fax: +390302659932
E-mail: giuseppe.corbe...@copanitalia.com
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to