teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コード例を改善

2021/03/09 12:57

投稿

sigsegv
sigsegv

スコア900

answer CHANGED
@@ -1,25 +1,48 @@
1
1
  自分なら、タイマー処理用のスレッドをプログラム開始時に1つ生成し、定期的に行う処理は全部それに任せます。排他処理を考える必要がありますがとりあえずグローバル変数で処理イメージを書くと;
2
- ```
3
- beepフラグ = ""; # グローバル変数
4
2
 
5
- メインスレッド
6
- ログを監視
7
- if beep条件を満たしていたら(更新がありエラー文字列が含まれていたら)
8
- beepフラグに現在時刻を設定
9
- else
10
- beepフラグをクリア
3
+ ```python
11
- …を繰り返す
4
+ import os
5
+ import time
6
+ import threading
12
7
 
13
- タイマー処理用のスレッド
14
- while True:
15
- 1秒間sleepする
16
- if beepフラグが設定されており10秒経過してい
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
- if beepカウント==6:
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
- beepカウント=0
44
+ th.start()
45
+ while True:
46
+ log_check()
47
+ time.sleep(2)
25
48
  ```

1

フラグの見直し

2021/03/09 12:57

投稿

sigsegv
sigsegv

スコア900

answer CHANGED
@@ -1,18 +1,19 @@
1
1
  自分なら、タイマー処理用のスレッドをプログラム開始時に1つ生成し、定期的に行う処理は全部それに任せます。排他処理を考える必要がありますがとりあえずグローバル変数で処理イメージを書くと;
2
2
  ```
3
- 更新フラグ = false;
4
- エラーフラグ = false;
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
- 10秒間sleepする
15
+ 1秒間sleepする
15
- if(エラーフラグ and not 更新フラグ)
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秒連続成立したかを調べるのが正しいですが、とりあえずイメージだけ