回答編集履歴

1

別案の提示とGitHubのリンク変更

2020/05/09 06:41

投稿

i-poper
i-poper

スコア12

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- [こちら](https://github.com/techno-tanoC/progress_test)のソースで言うと、progress.rsの97行目で`Mutex`の`lock()`を呼び出し、`poll()`でlockの獲得をしようとしていますが、これが`Pending`を返した場合に今回の現象が発生しているようです。
7
+ [こちら](https://github.com/techno-tanoC/progress_test/tree/68d09a5849890d8942b3b6158da0e3b6bf51f690)のソースで言うと、progress.rsの97行目で`Mutex`の`lock()`を呼び出し、`poll()`でlockの獲得をしようとしていますが、これが`Pending`を返した場合に今回の現象が発生しているようです。
8
8
 
9
9
 
10
10
 
@@ -29,3 +29,17 @@
29
29
  ```
30
30
 
31
31
  と入れると途中で停止すること無く正常に動作しました。
32
+
33
+
34
+
35
+ [追記]
36
+
37
+ 別案として、この用途であれば`tokio::sync::watch`を使うのが良いかなと思いました。以下参照ください。
38
+
39
+ [progress_test](https://github.com/i-poper/progress_test/tree/watch)
40
+
41
+ フォーマットしてしまったので差分がわかりにくいですが、`poll_write()`でダウンロードの状態が変わったら`watch::Sender.broadcast()`で通知しています。
42
+
43
+ ダウンロードキャンセルは、逆にUIスレッド側?から`watch::Sender.broadcast()`で通知します。
44
+
45
+ `poll_write()`での参照は`recv()`だと`await`が必要になってしまうので、`watch::Receiver.borrow()`で参照します。