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

回答編集履歴

2

ループ中にイベントループを止めない方法を追記。repl.it にコードを追加

2020/06/05 13:41

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,5 +1,14 @@
1
1
  タイマーの動作確認用コード
2
2
 
3
+ (ブラウザ上で実行して動作確認できます)
4
+ https://repl.it/@MiKLTea/QTimer-and-EventLoop-demo
5
+
6
+ 時間のかかる処理中にイベントループを動かす方法を追記。(コメント内)
7
+
8
+ 設計から手を入れられる段階では、この方法は避けた方が良いと思いますが、
9
+ イベントループが行うはずだった処理を自分で組んだループ内で定期的に呼び出す事で、
10
+ イベントループの停止を回避できます。→ processEvents
11
+
3
12
  ```python
4
13
 
5
14
  def main():
@@ -22,13 +31,19 @@
22
31
  def heavy_task():
23
32
  import time
24
33
  print("HEAVY TASK START")
34
+ # 10秒間待つ
35
+ for _ in range(100):
25
- time.sleep(10) # 10秒間待つ
36
+ time.sleep(0.1)
37
+
38
+ # イベントループを動かす
39
+ # app.processEvents()
40
+
26
41
  print("HEAVY TASK DONE")
27
42
 
28
43
  ## XXX: 3秒後に時間のかかる処理を実行
29
44
  #
30
45
  # 以下のコメントを外して動作を確認して見て下さい
31
- # QTimer.singleShot(3*1000, heavy_task)
46
+ QTimer.singleShot(3*1000, heavy_task)
32
47
 
33
48
  # 20秒後に終了
34
49
  QTimer.singleShot(20*1000, app.quit)
@@ -37,5 +52,4 @@
37
52
 
38
53
  if __name__ == '__main__':
39
54
  main()
40
-
41
55
  ```

1

コメントとソースの内容が一致していなかったので修正

2020/06/05 13:41

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -28,7 +28,7 @@
28
28
  ## XXX: 3秒後に時間のかかる処理を実行
29
29
  #
30
30
  # 以下のコメントを外して動作を確認して見て下さい
31
- QTimer.singleShot(3*1000, heavy_task)
31
+ # QTimer.singleShot(3*1000, heavy_task)
32
32
 
33
33
  # 20秒後に終了
34
34
  QTimer.singleShot(20*1000, app.quit)