<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi Ira,<br>
    <br>
    So, first things first: there are lots of wrong and very few (only
    one?) right way to use QThread which is, as you have eluded to, to
    use moveToThread() and not subclass QThread itself. The next most
    important thing is that you can *only* use the signal slot mechanism
    to communicate with your threaded object and these must be connected
    *before* the thread is started. All slots should be appropriately
    decorated with @pyqtSlot. Also important is that the object that is
    being threaded should not have a parent.<br>
    <br>
    I've written a simple gist (<a
      href="https://gist.github.com/jazzycamel/8abd37bf2d60cce6e01d"><a class="moz-txt-link-freetext" href="https://gist.github.com/jazzycamel/8abd37bf2d60cce6e01d">https://gist.github.com/jazzycamel/8abd37bf2d60cce6e01d</a></a>)
    that demonstrates these principles. Its a simple GUI that uses a
    threaded object to calculate the nth prime as requested by the user.
    If you enter a value of n of about 3000 it will take a few seconds
    to calculate in the background and you will see that the GUI is
    still animating the progress bar and stays responsive generally. You
    can request a prime as many times as you like and the thread stays
    running without a single run() function that terminates the thread
    on completion.<br>
    <br>
    This second gist (<a
      href="https://gist.github.com/jazzycamel/06b85f2dbad38a640a11"><a class="moz-txt-link-freetext" href="https://gist.github.com/jazzycamel/06b85f2dbad38a640a11">https://gist.github.com/jazzycamel/06b85f2dbad38a640a11</a></a>)
    show an example of a threaded object with a method containing an
    endless loop that can be started/stopped/restarted via a Boolean
    flag. It uses slots to change the flag and these are allowed to
    execute, even while the loop is running, by the use of
    qApp.processEvents(). Using this mechanism it would be possible to
    have a thread capable of running (non-contemporaneously) a number of
    different long running, short loop methods as you describe which
    could be started and stopped at will, you would just need a
    marshaling system to ensure only one method is started at a time. If
    you want to run multiple functions at the same time then you will
    need multiple instances of the thread/threaded object.<br>
    <br>
    I hope this helps,<br>
    Rob :o)<br>
    <br>
    <div class="moz-cite-prefix">On 10/02/2016 23:34, Ira Gray wrote:<br>
    </div>
    <blockquote
cite="mid:CA+QnYAUR3c0UxoDdhxrs_d6HsYjG3Tt4JDQYEngfh8njegyeFA@mail.gmail.com"
      type="cite">
      <div dir="ltr">Hello,
        <div><br>
        </div>
        <div>I'm currently at work so I don't have code I can share
          right this second, but I had a sort of epiphany moment and I'm
          hoping to get some clarification with how threading is
          normally intended to be executed in a Qt app. </div>
        <div><br>
        </div>
        <div>Backstory: </div>
        <div><br>
        </div>
        <div>I'm using Python3 and PyQt5. I've been trying to make
          signals and slots and moveToThread work for a couple days now
          and not having a lot of success. I can implement the toy
          examples I find around the web, but when I try to re-engineer
          the examples to do what I want, things start to break down. </div>
        <div><br>
        </div>
        <div>What I've been trying to do is create two classes. One
          class handles a very basic UI consisting of a couple buttons,
          and the other class houses a couple recursive functions. Long
          running, but shortish loops. My goal/idea was I'd have two
          threads. One main thread for the UI, and a second thread for
          the long running functions. Pressing a button on the UI would
          start/stop the functions dynamically, but the thread would
          constantly be running regardless of if it had meaningful
          things to do or not.</div>
        <div><br>
        </div>
        <div>Based on the examples I'd read on moveToThread, I thought
          this would be somewhat simple. Setup some signals to pass
          information back and forth, instantiate my two classes, and
          then pass the worker class off to a thread, and presto I'm off
          to the races. </div>
        <div><br>
        </div>
        <div>Only, I haven't been able to get it to work, and every
          example I've found of moveToThread is moving an object with
          only one function/member, usually called run. </div>
        <div><br>
        </div>
        <div>Which brings me to my question: </div>
        <div><br>
        </div>
        <div><b>Does the idea of having a class that holds multiple
            functions live in another thread permanently make sense? Can
            a thread even handle that? Is there a better way?</b></div>
        <div><br>
        </div>
        <div>Thanks for any input,</div>
        <div>I'm mostly self taught, so I'm worried I picked up a
          misconception somewhere or I'm lacking some critical
          understanding of what's actually going on under the hood.</div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
PyQt mailing list    <a class="moz-txt-link-abbreviated" href="mailto:PyQt@riverbankcomputing.com">PyQt@riverbankcomputing.com</a>
<a class="moz-txt-link-freetext" href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt">https://www.riverbankcomputing.com/mailman/listinfo/pyqt</a></pre>
    </blockquote>
    <br>
  </body>
</html>