回答編集履歴
2
コード例を改善
answer
CHANGED
@@ -1,25 +1,48 @@
|
|
1
1
|
自分なら、タイマー処理用のスレッドをプログラム開始時に1つ生成し、定期的に行う処理は全部それに任せます。排他処理を考える必要がありますがとりあえずグローバル変数で処理イメージを書くと;
|
2
|
-
```
|
3
|
-
beepフラグ = ""; # グローバル変数
|
4
2
|
|
5
|
-
メインスレッド
|
6
|
-
ログを監視
|
7
|
-
if beep条件を満たしていたら(更新がありエラー文字列が含まれていたら)
|
8
|
-
beepフラグに現在時刻を設定
|
9
|
-
else
|
10
|
-
|
3
|
+
```python
|
11
|
-
|
4
|
+
import os
|
5
|
+
import time
|
6
|
+
import threading
|
12
7
|
|
13
|
-
タイマー処理用のスレッド
|
14
|
-
while True:
|
15
|
-
1秒間sleepする
|
16
|
-
|
8
|
+
flag = 0 # global変数 ログにエラーがあった時刻
|
17
|
-
beepする
|
18
|
-
beepカウント+=1
|
19
|
-
else
|
20
|
-
beepカウント=0
|
21
9
|
|
10
|
+
# タイマースレッド
|
11
|
+
def timer_thread():
|
12
|
+
print("thread開始")
|
13
|
+
prev_flag = 0
|
14
|
+
beep_count = 0
|
15
|
+
|
16
|
+
while True:
|
17
|
+
time.sleep(1)
|
18
|
+
|
19
|
+
if flag > 0:
|
20
|
+
if flag != prev_flag: # 新しいエラーが発生していたら
|
21
|
+
prev_flag = flag
|
22
|
+
beep_count = 0
|
23
|
+
continue
|
24
|
+
|
25
|
+
if time.time() > (prev_flag + beep_count * 10):
|
26
|
+
print("BEEP")
|
27
|
+
beep_count += 1
|
28
|
+
|
22
|
-
|
29
|
+
if beep_count == 6:
|
30
|
+
print("MAIL")
|
31
|
+
|
32
|
+
|
33
|
+
# ログチェックに相当する処理(とりあえず"log.txt"の有無で代替)
|
34
|
+
def log_check():
|
35
|
+
global flag
|
36
|
+
if not os.path.exists("log.txt"): # ファイルをチェック
|
37
|
+
flag = 0
|
23
|
-
|
38
|
+
else:
|
39
|
+
if flag == 0: # 上書き防止するため flagをチェック
|
40
|
+
flag = time.time() # 質問者は上書きする仕様なのでこれは暫定措置
|
41
|
+
|
42
|
+
|
43
|
+
th = threading.Thread(target=timer_thread)
|
24
|
-
|
44
|
+
th.start()
|
45
|
+
while True:
|
46
|
+
log_check()
|
47
|
+
time.sleep(2)
|
25
48
|
```
|
1
フラグの見直し
answer
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
自分なら、タイマー処理用のスレッドをプログラム開始時に1つ生成し、定期的に行う処理は全部それに任せます。排他処理を考える必要がありますがとりあえずグローバル変数で処理イメージを書くと;
|
2
2
|
```
|
3
|
-
更新フラグ = false;
|
4
|
-
|
3
|
+
beepフラグ = ""; # グローバル変数
|
5
4
|
|
6
5
|
メインスレッド
|
7
6
|
ログを監視
|
7
|
+
if beep条件を満たしていたら(更新がありエラー文字列が含まれていたら)
|
8
|
-
|
8
|
+
beepフラグに現在時刻を設定
|
9
|
+
else
|
9
|
-
|
10
|
+
beepフラグをクリア
|
10
11
|
…を繰り返す
|
11
12
|
|
12
13
|
タイマー処理用のスレッド
|
13
14
|
while True:
|
14
|
-
|
15
|
+
1秒間sleepする
|
15
|
-
if
|
16
|
+
if beepフラグが設定されており10秒経過していたら
|
16
17
|
beepする
|
17
18
|
beepカウント+=1
|
18
19
|
else
|
@@ -21,6 +22,4 @@
|
|
21
22
|
if beepカウント==6:
|
22
23
|
メール送信
|
23
24
|
beepカウント=0
|
24
|
-
```
|
25
|
+
```
|
25
|
-
|
26
|
-
10秒sleepのところは1秒sleepにしてbeep条件が10秒連続成立したかを調べるのが正しいですが、とりあえずイメージだけ
|