Skip to content

Commit 7a52bc6

Browse files
committed
VizRankDialog: Restrict frequency of signal emitting
1 parent 8051662 commit 7a52bc6

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

Orange/widgets/visualize/tests/test_vizrankdialog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_run_vizrank(self):
4141
res_scores = sorted([compute_score(x) for x in states])
4242
self.assertListEqual(res.scores, res_scores)
4343
self.assertIsNot(scores, res.scores)
44-
self.assertEqual(task.set_partial_result.call_count, 6)
44+
self.assertEqual(task.set_partial_result.call_count, 2)
4545
self.assertEqual(task.set_progress_value.call_count, 7)
4646

4747
def test_run_vizrank_interrupt(self):
@@ -59,7 +59,7 @@ def test_run_vizrank_interrupt(self):
5959
res_scores = sorted([compute_score(x) for x in states[:2]])
6060
self.assertListEqual(res.scores, res_scores)
6161
self.assertIsNot(scores, res.scores)
62-
self.assertEqual(task.set_partial_result.call_count, 2)
62+
self.assertEqual(task.set_partial_result.call_count, 1)
6363
self.assertEqual(task.set_progress_value.call_count, 3)
6464
task.set_progress_value.assert_called_with(int(1 / 6 * 100))
6565

@@ -76,7 +76,7 @@ def test_run_vizrank_interrupt(self):
7676
res_scores = sorted([compute_score(x) for x in states])
7777
self.assertListEqual(res.scores, res_scores)
7878
self.assertIsNot(scores, res.scores)
79-
self.assertEqual(task.set_partial_result.call_count, 6)
79+
self.assertEqual(task.set_partial_result.call_count, 3)
8080
self.assertEqual(task.set_progress_value.call_count, 8)
8181
task.set_progress_value.assert_called_with(int(5 / 6 * 100))
8282

Orange/widgets/visualize/utils/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from queue import Queue, Empty
88
from types import SimpleNamespace as namespace
99
from typing import Optional, Iterable, List, Callable
10+
from threading import Timer
1011

1112
from AnyQt.QtCore import Qt, QSize, pyqtSignal as Signal, QSortFilterProxyModel
1213
from AnyQt.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush, QPen
@@ -393,6 +394,7 @@ def run_vizrank(compute_score: Callable, iterate_states: Callable,
393394
task.set_status("Getting scores...")
394395
res = Result(queue=Queue(), scores=None)
395396
scores = scores.copy()
397+
can_set_partial_result = True
396398

397399
def do_work(st, next_st):
398400
try:
@@ -405,7 +407,10 @@ def do_work(st, next_st):
405407
except Exception: # ignore current state in case of any problem
406408
pass
407409
res.scores = scores.copy()
408-
task.set_partial_result(res)
410+
411+
def reset_flag():
412+
nonlocal can_set_partial_result
413+
can_set_partial_result = True
409414

410415
state = None
411416
next_state = next(states)
@@ -418,8 +423,18 @@ def do_work(st, next_st):
418423
state = copy.copy(next_state)
419424
next_state = copy.copy(next(states))
420425
do_work(state, next_state)
426+
# for simple scores (e.g. correlations widget) and many feature
427+
# combinations, the 'partial_result_ready' signal (emitted by
428+
# invoking 'task.set_partial_result') was emitted too frequently
429+
# for a longer period of time and therefore causing the widget
430+
# being unresponsive
431+
if can_set_partial_result:
432+
task.set_partial_result(res)
433+
can_set_partial_result = False
434+
Timer(0.01, reset_flag).start()
421435
except StopIteration:
422436
do_work(state, None)
437+
task.set_partial_result(res)
423438
return res
424439

425440

0 commit comments

Comments
 (0)