TkInterのUIで、実行したい定刻処理をデータベースに登録する機能を作りました。また同UIから、それらの起動も達成しようと考えています。
予め登録の定刻処理をデータベースから抽出し配列に格納、ループで配列から出力される定刻処理で、schedule.every().~を組み立てる、
ループ最後では shedule.run.pendingを秒単位に行う別関数(start)を呼び出すことで、定刻起動を果たすことに成功しました。
同UIから先に登録したscheduleを、別操作で停止することが必要とも考え、UIの操作を維持するために上記をスレッドに払い出す手立てをとりました。
この結果同UIから別関数(stop)を呼び、秒間隔のshedule.run.pendingを停止させることに成功、起動と停止が思うように達成できていました。
【問題点】
定刻実行の設定に曜日指定があること、及び当該アプリを24時を廻って利用し続けている利用者のことを考慮する必要があると気が付きました。
対策として、24:00にscheduleをクリアし リスケを行うようなことが必要という解釈をしました。
time_count関数に24:00を廻ったら...という条件を追加、stop関数同様にスレッドをクリアする措置を投じようと思いましたが、
「 self.thread.join() 」の部分で、cannot join current thread というエラーが現れてしまう事象を招いています。
この行が問題ならば...と深く考えず当該行を除去してみたところ...24:00以降 定刻処理がWって起動してしまう事態を招いてしまいました。
UIからの操作でスレッドのクリアが対応できるのなら 定刻の自動でもできるはず、と浅はかな考えをしてしまいました。
そもそも scheduleを クリアして 入れ直すみたいな 措置は スレッドをクリアする手立てとは なんら関係を持たないのでしょうか????
初めてのPython、初めてのマルチスレッドで 一体どうしたものか? と頭を悩ましています。
どなたかご見解を頂けましたら幸いです。
Python
1 def time_count(self): 2 while not self.stop_flag: 3 schedule.run_pending() 4 time.sleep(1) 5 6 dt_now = datetime.datetime.now() 7 if dt_now.strftime("%X") == "00:00:00": 8 # 終了 9 if self.thread: 10 self.stop_flag = True 11 self.thread.join() #★☆★cannot join current thread が現れる、除去すると定刻処理がWる 12 self.thread = None 13 14 # リスケ 15 time.sleep(5) 16 self.on() 17 18 else: 19 print(dt_now.strftime("%X")) 20 21 22 def start(self): 23 # スレッドが無いなら生成してstart()する 24 if not self.thread: 25 self.thread = threading.Thread(target=self.time_count) 26 self.stop_flag = False 27 self.thread.start() 28 29 30 31 def stop(self): 32 # スレッドがある場合停止してjoin()する 33 if self.thread: 34 self.stop_flag = True 35 self.thread.join() 36 self.thread = None
20200623 10:11追記
breakいれたあとのtime_count関数「リスケ後定刻処理が2重になってしまう」
Python
1 def time_count(self): 2 while not self.stop_flag: 3 schedule.run_pending() 4 time.sleep(1) 5 6 reschedule = False 7 dt_now = datetime.datetime.now() 8 if dt_now.strftime("%X") == "09:57:00": 9 # 終了 10 reschedule = True 11 break 12 13 else: 14 print(dt_now.strftime("%X")) 15 16 #リスケ 17 if reschedule: 18 rechedule = False 19 time.sleep(5) 20 self.thread = None 21 self.on()
回答2件
あなたの回答
tips
プレビュー