Python ako spravne pouzivat threading?

Python ako spravne pouzivat threading?
« kdy: 01. 03. 2021, 08:39:20 »
Zdravim.
Snazim sa spravne pouzivat threading spojeny s GUI. Mam ale pocit ze nieco je zle.
Idea je taka ze nastartujem thready potom sa nastartuje GUI a to nasledne skusa ci je thread aktivny ak nie tak ho znova nastartuje. Ale mam pocit ze nieco je zle resp. slo by to vyriesit elegantnejsie. Vie niekto poradit ako sa to ma "spravne" riesit?
Kód: [Vybrat]
layout = [[sg.Output(size=(80,10))],
            [sg.Button('Exit')],[sg.Button('Debug ON/OFF'), sg.Button('Movement monitoring ON/OFF')]]

window = sg.Window('Shifter V 1.0', layout)

#XML_domino.XML_To_DB(Model, Batch)
#Start Thereading
S1t = threading.Thread(target=Stage_1, args=("task",))
S1t.start()
S2t = threading.Thread(target=Stage_2, args=("task",))
S2t.start()
S3t = threading.Thread(target=Stage_3, args=("task",))
S3t.start()
while 1:
   #Connect to SQL
    if(SQL_Status == False):
      connect_to_database()

    if(SQL_Status == True and RFID_Status == False):   
      connect_to_RFID()   
    if(SQL_Status == True and RFID_Status == True):
        check()
        if S1t.is_alive() is False:
            S1t = threading.Thread(target=Stage_1, args=("task",))
            S1t.start()
        if S2t.is_alive() is False:   
            S2t = threading.Thread(target=Stage_2, args=("task",))
            S2t.start()
        if S3t.is_alive() is False:   
            S3t = threading.Thread(target=Stage_3, args=("task",))
            S3t.start()
   
       
    window.Refresh()
    (event, value) = window.Read(timeout=1)
    if event == 'Debug ON/OFF':
       if enable_debug == 'True':
             enable_debug = 'False'
             print('Debug Mode OFF')
       else:
              enable_debug = 'True'   
    if event == 'Movement monitoring ON/OFF':
          if debug_only_movement == 'True':
                 debug_only_movement = 'False'
                 print('Movement monitoring OFF')
          else:
                    debug_only_movement = 'True' 
                    print('Movement monitoring ON')       
    if event == sg.WIN_CLOSED or event == 'Exit':
           
       break


Re:Python ako spravne pouzivat threading?
« Odpověď #1 kdy: 01. 03. 2021, 10:35:03 »
Co je Stage_1,Stage_2, Stage_2? Co to ma cele delat?

Re:Python ako spravne pouzivat threading?
« Odpověď #2 kdy: 01. 03. 2021, 14:07:00 »
To su funkcie ktore sa v podstate vykonavaju v cykle a obsluhuju databazu v style (select/update) etc skrz pyodbc

Re:Python ako spravne pouzivat threading?
« Odpověď #3 kdy: 01. 03. 2021, 14:37:29 »
Jeste je tam zahadna funkce check(), nehlede na to ze pokud je splinena podminka  if(SQL_Status == True and RFID_Status == True) bude se cyklus provadet do nekonecna, pouziti vlaken nedava moc vyznam. Dalsi vec je, ze pokud Stag_1, Stage_2, Stage_3 maji byt provedeny v poradi, coz naznacuje jejich nazev je pouziti vlaken vubec vhodne?

Re:Python ako spravne pouzivat threading?
« Odpověď #4 kdy: 01. 03. 2021, 15:06:00 »
IDontCare: praveze nie tie stage si predstav ako nezavysle. Teda kazda moze v kazdom momente dostat data. Preto su oddelene.
check() - je len funkcia bokom.
Cela idea je je sa nastartuje GUI. Spravy si spojenia a potom len v klude checkuje ci thread nespadol.

Ide mi o to ci je toto korektne riesenie.


Re:Python ako spravne pouzivat threading?
« Odpověď #5 kdy: 01. 03. 2021, 15:06:58 »
Kód: [Vybrat]
#Start Thereading
S1t = threading.Thread(target=Stage_1, args=("task",))
S2t = threading.Thread(target=Stage_2, args=("task",))
S3t = threading.Thread(target=Stage_3, args=("task",))



#Start a main Loop
while 1:
   #Connect to SQL
    if(SQL_Status == False):
      connect_to_database()

    if(SQL_Status == True and RFID_Status == False):   
      connect_to_RFID()   
    if(SQL_Status == True and RFID_Status == True):
        #check()
        if S1t.is_alive() is False:
            now = datetime.now()
            current_time = now.strftime("%H:%M:%S")
            print ( current_time  + 'Station 1 Restarted')
            S1t.start()
        if S2t.is_alive() is False:   
            now = datetime.now()
            current_time = now.strftime("%H:%M:%S")
            print ( current_time  + 'Station 2 Restarted')
            S2t.start()
        if S3t.is_alive() is False:   
            S3t.start()
            now = datetime.now()
            current_time = now.strftime("%H:%M:%S")
            print ( current_time  + 'Station 3 Restarted')   
       

Re:Python ako spravne pouzivat threading?
« Odpověď #6 kdy: 01. 03. 2021, 15:25:15 »
Jestli je to nový projekt, nebylo by lepší použít async?

Re:Python ako spravne pouzivat threading?
« Odpověď #7 kdy: 01. 03. 2021, 16:49:35 »
To je fakt tezke hadat. Nezname cele zadani. Nevime co se deje a proc. Jestli to funguje , tak to funguje..