diff --git a/lib/client/client.py b/lib/client/client.py index 55ba952..227f04a 100644 --- a/lib/client/client.py +++ b/lib/client/client.py @@ -220,7 +220,7 @@ class ZordonClient: while True: self.update_jobs() self.update_servers() - time.sleep(1) + time.sleep(3) def update_servers(self): servers = self.zeroconf.found_clients() @@ -232,34 +232,43 @@ class ZordonClient: def update_jobs(self, clear_table=False): - def update_row(tree, id, new_values, tags=None): - for item in tree.get_children(): - values = tree.item(item, "values") - if values[0] == id: - tree.item(item, values=new_values, tags=tags) - break - job_fetch = self.server_proxy.get_jobs() - if job_fetch is not None: - if len(job_fetch) < len(self.job_cache) or len(job_fetch) == 0: - clear_table = True - self.job_cache = job_fetch # update the cache only if its good data + def update_jobs_inner(): + def update_row(tree, id, new_values, tags=None): + for item in tree.get_children(): + values = tree.item(item, "values") + if values[0] == id: + tree.item(item, values=new_values, tags=tags) + break + job_fetch = self.server_proxy.get_jobs() + if job_fetch is not None: + if len(job_fetch) < len(self.job_cache) or len(job_fetch) == 0: + self.job_tree.delete(*self.job_tree.get_children()) + self.job_cache = job_fetch # update the cache only if its good data + for job in self.job_cache: + display_status = job['status'] if job['status'] != 'running' else \ + ('%.0f%%' % (job['percent_complete'] * 100)) # if running, show percentage, otherwise just show status + tags = (job['status'],) + values = (job['id'], + job['name'] or os.path.basename(job['input_path']), + job['renderer'] + "-" + job['renderer_version'], + job['priority'], + display_status, + job['time_elapsed'], + job['total_frames']) + try: + if self.job_tree.exists(job['id']): + update_row(self.job_tree, job['id'], new_values=values, tags=tags) + else: + self.job_tree.insert("", tk.END, iid=job['id'], values=values, tags=tags) + except tk.TclError: + pass + if clear_table: self.job_tree.delete(*self.job_tree.get_children()) - for job in self.job_cache: - display_status = job['status'] if job['status'] != 'running' else \ - ('%.0f%%' % (job['percent_complete'] * 100)) # if running, show percentage, otherwise just show status - tags = (job['status'],) - values = (job['id'], - job['name'] or os.path.basename(job['input_path']), - job['renderer'] + "-" + job['renderer_version'], - job['priority'], - display_status, - job['time_elapsed'], - job['total_frames']) - if self.job_tree.exists(job['id']): - update_row(self.job_tree, job['id'], new_values=values, tags=tags) - else: - self.job_tree.insert("", tk.END, iid=job['id'], values=values, tags=tags) + + x = threading.Thread(target=update_jobs_inner) + x.daemon = True + x.start() def show_new_job_window(self): new_window = tk.Toplevel(self.root) diff --git a/lib/client/server_proxy.py b/lib/client/server_proxy.py index 92a226a..667176a 100644 --- a/lib/client/server_proxy.py +++ b/lib/client/server_proxy.py @@ -34,15 +34,16 @@ class RenderServerProxy: def request(self, payload, timeout=5): return requests.get(f'http://{self.hostname}:{self.port}/api/{payload}', timeout=timeout) - def get_jobs(self): - all_jobs = self.request_data('jobs') - sorted_jobs = [] - if all_jobs: + def get_jobs(self, timeout=5): + all_jobs = self.request_data('jobs', timeout=timeout) + if all_jobs is not None: + sorted_jobs = [] for status_category in categories: found_jobs = [x for x in all_jobs if x['status'] == status_category.value] if found_jobs: sorted_jobs.extend(found_jobs) - return sorted_jobs + all_jobs = sorted_jobs + return all_jobs def get_data(self, timeout=5): all_data = self.request_data('full_status', timeout=timeout) diff --git a/lib/server/zeroconf_server.py b/lib/server/zeroconf_server.py index 96440a1..0c51853 100644 --- a/lib/server/zeroconf_server.py +++ b/lib/server/zeroconf_server.py @@ -48,8 +48,9 @@ class ZeroconfServer(): def _browse_services(self): browser = ServiceBrowser(self.zeroconf, self.service_type, [self._on_service_discovered]) - def _on_service_discovered(self, zeroconf, service_type, name, state_change=None): + def _on_service_discovered(self, zeroconf, service_type, name, state_change): info = zeroconf.get_service_info(service_type, name) + logger.debug(f"Zeroconf: {name} {state_change}") if service_type == self.service_type: if state_change == ServiceStateChange.Added or state_change == ServiceStateChange.Updated: self.client_cache[name] = info