Когда вы думаете об этом, ProgressView
делает именно это: всякий раз, когда задание запускается, оно отображает его в своем представлении.
Обратите внимание, что, как уже упоминалось в этой теме, ProgressView
тесно связан с API заданий затмения (т. Е. Он может не контролировать ни одной простой ванильной нити)
(из статьи О работе: API Eclipse Jobs )
Так что, может быть, вы можете начать с просмотра кода в org.eclipse.ui.internal.progress.ProgressView
, для которого требуется ProgressViewerContentProvider
на основе ProgressContentProvider
(реализация IProgressUpdateCollector
)
Все, кажется, основано на синглтоне ProgressViewUpdater
, который создает один поток пользовательского интерфейса, отвечающий за мониторинг этих заданий:
/**
* Create the update job that handles the updatesInfo.
*/
private void createUpdateJob() {
updateJob = new WorkbenchJob(ProgressMessages.ProgressContentProvider_UpdateProgressJob) {
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus runInUIThread(IProgressMonitor monitor) {
//Abort the job if there isn't anything
if (collectors.length == 0) {
return Status.CANCEL_STATUS;
}
if (currentInfo.updateAll) {
synchronized (updateLock) {
currentInfo.reset();
}
for (int i = 0; i < collectors.length; i++) {
collectors[i].refresh();
}
} else {
//Lock while getting local copies of the caches.
Object[] updateItems;
Object[] additionItems;
Object[] deletionItems;
synchronized (updateLock) {
currentInfo.processForUpdate();
updateItems = currentInfo.refreshes.toArray();
additionItems = currentInfo.additions.toArray();
deletionItems = currentInfo.deletions.toArray();
currentInfo.reset();
}
for (int v = 0; v < collectors.length; v++) {
IProgressUpdateCollector collector = collectors[v];
if (updateItems.length > 0) {
collector.refresh(updateItems);
}
if (additionItems.length > 0) {
collector.add(additionItems);
}
if (deletionItems.length > 0) {
collector.remove(deletionItems);
}
}
}
return Status.OK_STATUS;
}
};
updateJob.setSystem(true);
updateJob.setPriority(Job.DECORATE);
updateJob.setProperty(ProgressManagerUtil.INFRASTRUCTURE_PROPERTY, new Object());
}