2

ネットワークコース用のプログラムを作成したいのですが、データをリッスンしてデータを受信しない場合はデータをリッスンするソケットがあります。プログラムを終了する必要があります。threading.Timer を使用してタイマーのように動作t = threading.Timer(5, end_data)し、関数に受信データをリッスンしますが、 end_data でプログラムを終了できません。

def end_data():
    sys.exit()

誰でも私を助けることができますか?私はまた、以下のコードをテストします。芽はターミナルで実行中のプログラムを終了しませんでした:(

def end_data():
    try:
        sys.exit()
    except:
        print"exception"

端末の印刷を停止すると、Tinas-MacBook-Pro:~ tina$ が表示されると思います

私は main ではなく receive という名前の関数でソケットをリッスンしています。データを受信せずに 5 秒経過すると end_data が実行され、この関数の一部が以下のような受信関数に戻らないようです

def receive():
   s2 = socket(AF_INET, SOCK_DGRAM)
   s2.bind(addr3_2) 
   global end_call
   global base_window
   write=open('pictur.jpg','wb')
   s = socket(AF_INET, SOCK_DGRAM) 
   s.bind(addr3)
   while(end_call==0):
      t = threading.Timer(5, end_data)
      t.start()       
      recv_data, addr = s.recvfrom(3500)#size ro hala badan check kon
      t.cancel()

最初に、5 秒後にグローバル var end_call を設定することにしましたが、関数を受信するために戻ってこないため、機能しませんでした

私にとって非常に興味深いのは、次のように data_end を定義する場合です。

def end_data():
    os._exit
    print "Hi"

こんにちは、出力に出力されます:O

4

3 に答える 3

0

たぶん、このような設定を試してみてください

run_program = True

def end_data() :
    global run_program
    run_program = False

t = threading.Timer(5, end_data)
t.start()

while run_program:
    #do stuff
    time.sleep(1)

t.join() #maybe not needed

t.start() を呼び出したことを確認してください :)

于 2013-05-17T15:23:39.300 に答える
0

スレッド Events の使用についてはどうですか?

import threading

event = threading.Event()

def signal_stop():
    try:
        # do what you have to do
    finally:
        event.set()


t = threading.Timer(5, signal_stop)

print 'start thread and wait for it'
t.start()
event.wait()
print 'done'
于 2013-05-18T09:46:26.643 に答える