Quand on y pense, le ProgressView
fait exactement cela: chaque fois qu'un travail démarre, il l'affiche dans sa vue.
Note, comme mentionné dans ce fil, la ProgressView
is tightly coupled with the eclipse Jobs API (elle ne peut pas surveiller tout fil de plain vanilla)
(De l'article On the Job: The Eclipse Jobs API)
Alors peut-être vous pouvez commencer par regardant le code org.eclipse.ui.internal.progress.ProgressView
, qui a besoin d'un ProgressViewerContentProvider
, sur la base d'une ProgressContentProvider
(mise en œuvre d'un IProgressUpdateCollector
)
la toute chose semble être basée sur la ProgressViewUpdater
singleton, ce qui crée un thread d'interface utilisateur en charge de la surveillance de ces travaux:
/**
* 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());
}
bonne réponse, VonC. : Pouce en l'air: – pimpf0r
Merci, je vais essayer demain. – Valadas