2016-08-09 4 views
3

私は自分のpythonがどのような場合にそれが何かを実行する(これは起こり得ないかもしれない)別の機能を実行します。pythonで 'duration'のための 'try' 3

正確なシナリオは、自動化システムの何かがそれにアクセスしようとしたときにOutlookが提供する「警告」画面をバイパスしています。最初のコマンドがoutlookからデータを取得するために送信されるか、または別の方法でOutlookを操作すると、pythonスクリプト全体が停止して、ユーザーがOutlookプログラムで「許可」をクリックして続行するのを待っています。私がしたいことは、それが見通しの操作をしようとすると、開始するタイマーがあるということです。タイマーがX値に達すると、outlookに送信されたコマンドをスキップし、別の一連のアクションを実行します。

私はこれが同時プロセスを実行するために「スレッディング」と呼ばれるものにつながるかもしれないと感じていますが、私はコンセプトを複雑にするかもしれないと感じています。私はこれを達成するために書かれたかもしれないと思うもののモックアップを行うとしたら、これは私が「以外は」今までにないことを、99.9%確信して...

time1 = time.clock() 
try: 
    mail = inbox.Items[0].Sender 
except if time1 > time1+10: 
    outlookWarningFunc() 

を思い付くしたいものですこのようにして、なぜ機能的なコードではないのですが、少なくとも私が到達しようとしていることを伝えるためには、私が考えることができる最も近いものでした。

お時間をいただきありがとうございます。ありがとうございました。

+0

ちょうどwhileループを使用してtry/except節のwhileループをラップして、何かをキャッチすることができます –

+1

@PeterWang、私はこの問題に近づいても同じことを考えました。問題は、コマンド "mail = inbox.Items [0] .Sender"がヒットしたら、プロセス全体が前進しなくなることです。後続のコマンドは、スレッディングを必要とするという私の理論を打ち消すものではありません。私は現在、それを現在の解決策として研究中です。考えてくれてありがとう、私はそれを感謝します! :) –

+0

Outlookアプリケーションが実際にエラーを発生させていないので、これは 'try/except'ブロックではありません。モーダルダイアログボックスでユーザー入力を待っています。 –

答えて

4

解決策の一つはこれです:

import threading 

mail = None 

def func(): 
    global mail 
    mail = inbox.Items[0].Sender 

thread = threading.Thread(target=func) 
thread.start() 

thread.join(timeout=10) 
if thread.is_alive(): 
    # operation not completed 
    outlookWarningFunc() 
    # you must do cleanup here and stop the thread 

あなたが操作を実行する新しいスレッドを開始し、それが完了するか、タイムアウトになるまで、10秒待ちます。次に、ジョブが完了したかどうかを確認します。スレッドが生存している場合は、タスクがまだ完了していないことを意味します。

このソリューションの落とし穴は、スレッドがまだバックグラウンドで実行されているため、スレッドが例外を完了または発生させるためのクリーンアップアクションを実行する必要があることです。

+0

こんにちは、私はあなたの提案されたコードを実装しました(助けに時間を入れてくれてありがとう!)が、私は "While"ステートメントを使用していたのと同じ結果を持っているようです。スレッドがキックオフされ、mail = inbox.Items [0] .Senderが実行されると、Outlookでウィンドウがポップアップしますが、何も前進しません。タイムアウトはわずか10秒で、私は20回のテストを待っていました。あなたは私が「クリークアップ」していると思いますか? :P –

+0

私が言ったように、スレッドがまだ実行中である(ウィンドウがポップアップして閉じない)ので、コードはフォワードを実行しています。時間が経過しても、スレッドは殺されませんが、スクリプトはさらに非同期になります(if文の直後に 'print'を置いてテストすることができます)。実際には別のスレッドを削除するのは本当に難しいです。 if文の中のスクリプトからウィンドウを強制的に閉じるには、ある種の関数を使うべきです。 – warownia1

関連する問題