8

I am new to python programming. I am trying to make a GUI with stoppable threads. I borrowed some code from https://stackoverflow.com/a/325528

class MyThread(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self, *args, **kwargs):
        super(MyThread, self).__init__(*args, **kwargs)
        self._stop = threading.Event()

    def stop(self):
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

I have function which creates a thread for another function in another class that runs an infinite loop.

class MyClass :

    def clicked_practice(self):

        self.practicethread = MyThread(target=self.infinite_loop_method)
        self.practicethread.start()

    def infinite_loop_method()
        while True :
            // Do something


    #This doesn't seem to work and I am still stuck in the loop

    def infinite_stop(self)
        if self.practicethread.isAlive():
        self.practicethread.stop()

I want to create a method to stop this thread . What's happening here?

Community
  • 1
  • 1
Ada Xu
  • 953
  • 4
  • 14
  • 31

2 Answers2

13

I think you missed the 'The thread itself has to check regularly for the stopped() condition' bit of that documentation.

Your thread needs to run like this:

while not self.stopped():
    # do stuff

rather than while true. Note that it is still only going to exit at the 'start' of a loop, when it checks the condition. If whatever is in that loop is long-running, that may cause unexpected delays.

aruisdante
  • 8,875
  • 2
  • 30
  • 37
  • Worse yet, some people do this: `while True: \n\t if not threadObject.stopped():`. I was pretty shocked the first time I saw someone waste a **whole indentation level** just for that. – Adrian Feb 10 '20 at 08:24
-2
import threading
import time
class MultiThreading:

    def __init__(self):
        self.thread = None
        self.started = True
    def threaded_program(self):
        while self.started:
            print("running")
            # time.sleep(10)
    def run(self):
        self.thread = threading.Thread(target=self.threaded_program, args=())
        self.thread.start()
    def stop(self):
        self.started = False
        self.thread.join()
Shishir
  • 327
  • 3
  • 6
  • 3
    While correct in principle, this is missing an explanation. Worse, the semantics are confusing: `started` is set `True`, before `run()` is executed; `thread` is set to `None` in the constructor instead of the `Thread()` being created there; `started` should be called `running` (as is evident by the print argument). – NichtJens Apr 20 '20 at 20:48