Fix T62870: progress in taskbar not updated when cancelling render

This commit is contained in:
Brecht Van Lommel 2019-04-04 13:46:04 +02:00
parent c384b5ddbd
commit 0298f1d634
Notes: blender-bot 2023-02-14 03:15:41 +01:00
Referenced by issue #62870, Terminating Cycles render on Windows does not clear progress indication in taskbar icon
1 changed files with 41 additions and 30 deletions

View File

@ -226,6 +226,38 @@ float WM_jobs_progress(wmWindowManager *wm, void *owner)
return 0.0;
}
static void wm_jobs_update_progress_bars(wmWindowManager *wm)
{
float total_progress = 0.f;
float jobs_progress = 0;
for (wmJob *wm_job = wm->jobs.first; wm_job; wm_job = wm_job->next) {
if (wm_job->threads.first && !wm_job->ready) {
if (wm_job->flag & WM_JOB_PROGRESS) {
/* accumulate global progress for running jobs */
jobs_progress++;
total_progress += wm_job->progress;
}
}
}
/* if there are running jobs, set the global progress indicator */
if (jobs_progress > 0) {
wmWindow *win;
float progress = total_progress / (float)jobs_progress;
for (win = wm->windows.first; win; win = win->next)
WM_progress_set(win, progress);
}
else {
wmWindow *win;
for (win = wm->windows.first; win; win = win->next)
WM_progress_clear(win);
}
}
/* time that job started */
double WM_jobs_starttime(wmWindowManager *wm, void *owner)
{
@ -438,6 +470,8 @@ static void wm_job_free(wmWindowManager *wm, wmJob *wm_job)
/* stop job, end thread, free data completely */
static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job)
{
bool update_progress = (wm_job->flag & WM_JOB_PROGRESS) != 0;
if (wm_job->running) {
/* signal job to end */
wm_job->stop = true;
@ -459,6 +493,11 @@ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job)
/* remove wm_job */
wm_job_free(wm, wm_job);
/* Update progress bars in windows. */
if (update_progress) {
wm_jobs_update_progress_bars(wm);
}
}
/* wait until every job ended */
@ -548,8 +587,6 @@ void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt)
void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
{
wmJob *wm_job, *wm_jobnext;
float total_progress = 0.f;
float jobs_progress = 0;
for (wm_job = wm->jobs.first; wm_job; wm_job = wm_jobnext) {
wm_jobnext = wm_job->next;
@ -615,41 +652,15 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
wm_job_free(wm, wm_job);
}
}
else if (wm_job->flag & WM_JOB_PROGRESS) {
/* accumulate global progress for running jobs */
jobs_progress++;
total_progress += wm_job->progress;
}
}
else if (wm_job->suspended) {
WM_jobs_start(wm, wm_job);
}
}
else if (wm_job->threads.first && !wm_job->ready) {
if (wm_job->flag & WM_JOB_PROGRESS) {
/* accumulate global progress for running jobs */
jobs_progress++;
total_progress += wm_job->progress;
}
}
}
/* if there are running jobs, set the global progress indicator */
if (jobs_progress > 0) {
wmWindow *win;
float progress = total_progress / (float)jobs_progress;
for (win = wm->windows.first; win; win = win->next)
WM_progress_set(win, progress);
}
else {
wmWindow *win;
for (win = wm->windows.first; win; win = win->next)
WM_progress_clear(win);
}
/* Update progress bars in windows. */
wm_jobs_update_progress_bars(wm);
}
bool WM_jobs_has_running(wmWindowManager *wm)