1

だから私はこのスクリプトを書きました:

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」が呼び出されると、あとで無期限にループするはずのメインプログラムがクラッシュし、他のスレッドがまだ実行されている場合があるため、すべてが非常に奇妙です。

4

1 に答える 1

0

スレッドを正気で殺すことはできません。 スレッドを強制終了する代わりに、スレッドに何を実行させ、何を実行させたいかだけをコード化します。そうすれば、殺す必要がなくなります。

他の 2 人と車を共有していて、車が私道にない場合、車を運転している人を殺すことはできません。これで車は自由に使用できるようになりますが、元に戻す前にドライバーを殺してしまったため、私道にはありません。代わりに、彼らに電話して、車を元に戻すように伝え、作業が終わったら車を解放してもらいます。

于 2013-10-06T20:47:44.573 に答える