だから私はこのスクリプトを書きました:
def schedule_setup():
# KILL OLD THREADS SHOULD THEY EXIST
global active
active = False
time.sleep(3)
active = True
global threadlist
threadlist = []
try:
sql = "SELECT TIME_TO_RUN FROM time_table"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
#row[0].strftime('%H:%M')
t = threading.Thread(target=th,args=(row[0].strftime('%H:%M'),))
t.start()
threadlist.append(t)
# JOIN all threads to main memory
#for count in threadlist:
#count.join()
sql = "UPDATE motor SET UPDATE_SCHEDULE = 0"
try:
cursor.execute(sql)
# commit the changes in database
db.commit()
except:
# Rollback in case there is any error
print "no worky"
db.rollback()
except:
print "Error: UNABLE TO GET TABLE DATA"
SQL でのセットアップに時間がかかり、スケジュールされたイベントを作成してアクションを実行します。最初にすべてのアクティブなスレッドのスレッド「キラー」を入れたので、時間が更新されたためにこのスレッドを再度呼び出すと、古いスレッドを強制終了して新しいスレッドに置き換えることができます。それはすべて私が望むように機能しますが、アクションが呼び出されるとすぐにプログラム全体がクラッシュします...これが呼び出すコードは次のとおりです。
def th(run_time):
global active
schedule.every().day.at(run_time).do(run_motor)
while active == True:
schedule.run_pending()
time.sleep(1)
スレッドが毎秒チェックする方法を確認しますか? そのため、新しいスレッドを作成しようとするとスレッドが強制終了されますが、「run_motor」が呼び出されると、あとで無期限にループするはずのメインプログラムがクラッシュし、他のスレッドがまだ実行されている場合があるため、すべてが非常に奇妙です。