回答編集履歴

2

コード例を改善

2021/03/09 12:57

投稿

sigsegv
sigsegv

スコア895

test CHANGED
@@ -1,49 +1,95 @@
1
1
  自分なら、タイマー処理用のスレッドをプログラム開始時に1つ生成し、定期的に行う処理は全部それに任せます。排他処理を考える必要がありますがとりあえずグローバル変数で処理イメージを書くと;
2
-
3
- ```
4
-
5
- beepフラグ = ""; # グローバル変数
6
2
 
7
3
 
8
4
 
9
- メインスレッド
5
+ ```python
10
6
 
11
- ログを監視
7
+ import os
12
8
 
13
- if beep条件を満たしていたら(更新がありエラー文字列が含まれていたら)
9
+ import time
14
10
 
15
- beepフラグに現在時刻を設定
11
+ import threading
16
-
17
- else
18
-
19
- beepフラグをクリア
20
-
21
- …を繰り返す
22
12
 
23
13
 
24
14
 
25
- タイマー処理用のスレッド
26
-
27
- while True:
28
-
29
- 1秒間sleepする
30
-
31
- if beepフ設定されており10秒経過してい
15
+ flag = 0 # global変数 ログにエあっ時刻
32
-
33
- beepする
34
-
35
- beepカウント+=1
36
-
37
- else
38
-
39
- beepカウント=0
40
16
 
41
17
 
42
18
 
43
- if beepカウント==6:
19
+ # タイマースレッド
44
20
 
45
- メール送信
21
+ def timer_thread():
46
22
 
23
+ print("thread開始")
24
+
25
+ prev_flag = 0
26
+
47
- beepカウント=0
27
+ beep_count = 0
28
+
29
+
30
+
31
+ while True:
32
+
33
+ time.sleep(1)
34
+
35
+
36
+
37
+ if flag > 0:
38
+
39
+ if flag != prev_flag: # 新しいエラーが発生していたら
40
+
41
+ prev_flag = flag
42
+
43
+ beep_count = 0
44
+
45
+ continue
46
+
47
+
48
+
49
+ if time.time() > (prev_flag + beep_count * 10):
50
+
51
+ print("BEEP")
52
+
53
+ beep_count += 1
54
+
55
+
56
+
57
+ if beep_count == 6:
58
+
59
+ print("MAIL")
60
+
61
+
62
+
63
+
64
+
65
+ # ログチェックに相当する処理(とりあえず"log.txt"の有無で代替)
66
+
67
+ def log_check():
68
+
69
+ global flag
70
+
71
+ if not os.path.exists("log.txt"): # ファイルをチェック
72
+
73
+ flag = 0
74
+
75
+ else:
76
+
77
+ if flag == 0: # 上書き防止するため flagをチェック
78
+
79
+ flag = time.time() # 質問者は上書きする仕様なのでこれは暫定措置
80
+
81
+
82
+
83
+
84
+
85
+ th = threading.Thread(target=timer_thread)
86
+
87
+ th.start()
88
+
89
+ while True:
90
+
91
+ log_check()
92
+
93
+ time.sleep(2)
48
94
 
49
95
  ```

1

フラグの見直し

2021/03/09 12:57

投稿

sigsegv
sigsegv

スコア895

test CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  ```
4
4
 
5
- 更新フラグ = false;
6
-
7
- エラーフラグ = false;
5
+ beepフラグ = ""; # グローバル変数
8
6
 
9
7
 
10
8
 
@@ -12,9 +10,13 @@
12
10
 
13
11
  ログを監視
14
12
 
15
- 更新があれば更新フグをセット(無けばリセット)
13
+ if beep条件を満たしていたら(更新がありエー文字列が含まていたら)
16
14
 
17
- エラー文字列があればエラーフラグをセット(無ければリセット)
15
+ beepフラグに現在時刻設定
16
+
17
+ else
18
+
19
+ beepフラグをクリア
18
20
 
19
21
  …を繰り返す
20
22
 
@@ -24,9 +26,9 @@
24
26
 
25
27
  while True:
26
28
 
27
- 10秒間sleepする
29
+ 1秒間sleepする
28
30
 
29
- if(エラーフラグ and not 更新フラグ)
31
+ if beepフラグが設定されており10秒経過していたら
30
32
 
31
33
  beepする
32
34
 
@@ -45,7 +47,3 @@
45
47
  beepカウント=0
46
48
 
47
49
  ```
48
-
49
-
50
-
51
- 10秒sleepのところは1秒sleepにしてbeep条件が10秒連続成立したかを調べるのが正しいですが、とりあえずイメージだけ