首页 > 解决方案 > Thread While True:循环使代码无法迭代

问题描述

我有一个线程作为守护进程运行。

在这个线程中,我希望不断更新一些变量,这些变量依赖于从 MySQL 数据库中读取行。

问题是,程序不想遍历 While True:-loop,尽管它在线程内部。这不是线程的重点:我可以同时运行两个循环吗?

import threading
import tkinter as tk
import pip
import time
import mysql.connector
from time import sleep

global score
global countdown

en = 1
score = 0
countdown = 1
print("Hiya!")

mydb = mysql.connector.connect(
    host="",
    user="",
    password="",
    database='',
    auth_plugin=''
)

mycursor = mydb.cursor(prepared=True)

class Mysql(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.daemon = True
        self.en = 1
        self.læsTidScoreNu = "SELECT tidSCoreNu FROM bois WHERE id = 1"
        self.læsTidMål = "SELECT tidMål FROM bois WHERE id = 1"
        self.opdaterTidMål = "UPDATE bois SET tidMål = %s WHERE id = %s"
        self.læsStopKnap = "SELECT stopKnap FROM bois WHERE id = 1"
        self.run()

    def run(self) -> None:
        global mycursor
        global mydb

        while True:
            mycursor.execute(self.læsTidScoreNu)
            self.råTidScoreNu = mycursor.fetchone()
            self.tidScoreNu = float("{}".format('%.2f' % self.råTidScoreNu))
            mycursor.execute(self.læsTidMål)
            self.råTidMål = mycursor.fetchone()
            self.tidMål = float("{}".format('%.2f' % self.råTidMål))
            mycursor.execute(self.læsStopKnap)
            self.stopKnap = mycursor.fetchone()



            mydb.commit()



data = Mysql()

print(data.råTidScoreNu)
print(data.tidMål)

forevigt = 0

while (forevigt != 1):
    i = 0.00


    # Servodøren skal åbnes her i denne kode
    while (data.stopKnap != 1):
        # Indtast Pinkoden
        f = int(input(
            "Kodeord - bemærk her, at kodeordene er pinkoderne fra min egen database, bare indtast en værdi mellem 1-6"))
        mycursor.execute("SELECT id,adresse,name,pinkode_brugt,score FROM bois WHERE id=%s", (f,))

        # MySQL Commands
        opdaterSlutScoren = "UPDATE bois SET pinkode_brugt = pinkode_brugt +1, score = %s WHERE id = %s"
        opdaterTidScoreNu = "UPDATE bois SET tidScoreNu = %s WHERE id = %s"
        myresult = mycursor.fetchall()

        row_count = mycursor.rowcount
        print(myresult)
        print("number of affected rows: {}".format(row_count))

        if(f == 1):
            print("ommer")

        else:
            if (row_count == 1):

                # Servomotordøren åbner(function)
                print(row_count)
                print(data.tidScoreNu)
                while (i != data.tidMål) and (i <= data.tidMål) and (data.stopKnap != 1):
                    print('%.2f' % i)
                    i = i + 0.01
                    timeLeft = data.tidScoreNu - i
                    iTwo = data.tidMål
                    countdown = float('%.2f' % i)
                    score = str("{}".format('%.2f' % i))
                    mycursor.execute(opdaterTidScoreNu, (score,en))
                    print("THIS IS X", data.tidMål)
                    time.sleep(0.01)
                    mydb.commit()

                # Hvis spillet stoppes, or i ikke når timerens slutværdi, vil scoren gemmes
                if (i != data.tidScoreNu):
                    # Point bliver tilføjet
                    print(score, i, countdown, myresult)
                    print("Dette er dit resultat: {}".format(score))
                    mycursor.execute(opdaterSlutScoren, (score, f))



                else:
                    # Point bliver tilføjet
                    print("Ingen point")
                    mycursor.execute(opdaterSlutScoren, (score, f))
            if row_count == 0:
                print("fejl!")

            print("Færdig")
            i = 0
            mycursor.execute(opdaterTidScoreNu, ("0", en))
            mydb.commit()

    # Mangler servo-logik, samt en timer

标签: pythonloopsthread-safety

解决方案


推荐阅读