2012-02-15 20 views
0

前置き...私はしばらくのpythonの周りいじくるてきたと私は最近、マルチスレッド関わる何かが出ている... HERESに私が持っているもの...Python:例の説明...これはなぜ機能しますか?

import pythoncom 
import wmi 
import threading 

class Info(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
    def run(self): 
     pythoncom.CoInitialize() 
     c = wmi.WMI() 
     detect = c.Win32_ComputerShutdownEvent.watch_for() 
     detect() 
     return 

if __name__ == '__main__': 
    Info().start() 
    for process in c.Win32_Process(Name="something.exe"): 
     result = process.Terminate() 

だから私の質問これはどうしてですか? Threading.Threadの継承のプロセスに関する全体的な質問かもしれませんが、Info()クラスにはstart()defがありません。なぜ実行defが始まるのですか?

これは実際には、Windowsがシャットダウンしたときに常にハングアップするようなアプリケーションを停止するために使用する必要があった非常に便利なアプリケーションです... Windowsシャットダウンイベントが発生したときの検出は頭痛のビットですが、その日!

答えて

4

it's defined in the parentです。子クラスで親クラスが見つからない(または処理された)場合、親クラスの属性がチェックされます。

+0

おかげで、私は完全にそれ以上に読み込まれている必要があり、私はスレッドでビットをいじると私はキュー...良い情報を実装する必要が今見てきました! –

2

サブクラスThreadは、を呼び出すと、自動的にrun()と呼ばれます。開始はThreadで定義されています。

docs

から活動を指定するには、2つの方法があります。コンストラクタに呼び出し可能オブジェクトを渡すことによって、またはサブクラスでrun()メソッドをオーバーライドすることは。

とそれが制御の別のスレッドで呼び出されるオブジェクトのrun()メソッドのために配置start()

上のドキュメントから。

1

スレッドが終了するまで待つつもりはありませんか? その場合:

if __name__ == '__main__': 
    info = Info() 
    info.start() 
    info.join() 
    for process in c.Win32_Process(Name="something.exe"): 
     result = process.Terminate() 
+0

応答をありがとう...その面白い実際に私はTKinterで作成された別個のアプリケーションがエンドレスループで実行するように設計されている別のアプリケーションでこの問題を抱えてきました。これはもともと、そのアプリケーションで組み込みを実行するように設計されており、wmiモジュールのwatch()がアプリケーションフローを保持しているので、これを他の "something.exe"と一緒に呼び出すだけで、Windowsシャットダウンが生成されると、 ... something.exeをkillし、ハングしたプロセスはありません。 –

関連する問題