pythonのモジュールpingsを使用してネットワーク上にいるPCの死活管理をしようとしております。
tkinterを用いて全PCを一覧表示してpingが通れば名前の前に□を、通らなければ■を付けて表示する機能を持たせました。
上から順番にpingを飛ばした場合は正常な値が返ってくるのですが、
それだと処理に時間がかかるためPCごとにスレッドに分けてpingを飛ばすと全てpingが通る判定となってしまいます。
ソースは下記の通りですが、なぜこのような現象になるのかご教授ください。
また、終了時に[×]ボタンで終了すると例外エラーが表示されるので
ボタンを押して全スレッドが終了するのを待つような処理を実装しようとしましたが、
これもまたうまく動作しません。
こちらも合わせてご教授いただけると幸甚です。
python
1import tkinter as tk 2import pings 3import threading as th 4 5PEOPLE = { 6 '■ user1':'PC1', 7 '■ user2':'PC2', 8 '■ user3':'PC3', 9 '■ user4':'PC4' 10 } 11 12LIST_PEOPLE = list(PEOPLE.keys()) 13root = tk.Tk() 14 15def callback(): 16 global thre 17 thre = [] 18 for mem in range(len(LIST_PEOPLE)): 19 thre.append(th.Thread(target=pin, args=([mem, PEOPLE[LIST_PEOPLE[mem]]]))) 20 thre[mem].start() 21 22def pin(mem, pc): 23 p = pings.Ping() 24 res = p.ping(pc) 25 if res.is_reached(): 26 lbl[mem]['text'] = '□' + lbl[mem]['text'][1:] 27 else: 28 lbl[mem]['text'] = '■' + lbl[mem]['text'][1:] 29 root.after(5000, pin(mem, pc)) 30 31def close_win(): 32 for thread in thre: 33 thread.join() 34 35lbl = [] 36j = 0 37for i in LIST_PEOPLE: 38 lbl.append(tk.Label(root, text=i, font=('consolas', 10))) 39 lbl[j].pack(anchor=tk.NW, padx=20) 40 j += 1 41btn = tk.Button(root, text='close', font=('consolas', 10), command=close_win) 42btn.pack() 43callback() 44 45root.mainloop()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/14 04:09
2020/02/14 07:04 編集