일식 RCP 응용 프로그램을 작성 중입니다. 나는 약 800자를 가지고있는 ScalableLayeredPane
을 가지고있다.작업을 사용하여 확대/축소 작업을 취소 할 수 없습니다.
setScale()
방법을 사용하여 줌 값을 변경해야합니다.
또한 Job을 사용하여 확대 진행 상황을 표시하려고합니다.
asyncexec
메서드를 사용하여 setScale()
함수를 호출합니다. 그러나 내 GUI가 굶주리고 있으며 취소 버튼도 클릭 할 수 없습니다.
이 문제에 대한 도움을 주시면 감사하겠습니다.
내가하는 일은 다음과 같습니다.
Job job = new Job("Some job") {
@Override
protected IStatus run(IProgressMonitor monitor) {
// Decide scaling amount
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
scalableLayeredPaneObj.setScale(scale); }
});
// Check if cancel is pressed and return status accordingly
if(monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
};
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if(event.getResult().isOK()) {
System.out.println("Job done!");
// Do something
} else {
System.out.println("Job cancelled!");
// Do something else
}
}
});
job.setUser(true);
job.schedule();
그러나이 특정 코드를 실행하면 GUI가 응답하지 않고 취소 버튼을 누를 수 없습니다. 항상 "Job done!"
메시지를 받고 있습니다.
또한 UI 스레드를 실행하는 데 PlatformUI#getWorkbench()#getDisplay()#syncExec
메서드를 사용해 보았습니다. 그것은 작동하지 않았다.
내 분석에 따르면 setScale
작업 자체가 오랜 시간이 걸려 GUI가 응답하지 않는 것으로 나타났습니다. Main
스레드가 끊어지지 않도록 가능한 한 다른 스레드에서 setScale
으로 전화해야합니다.
문제를 설명하는 코드를 제시해야합니다. –
@ greg-449 샘플 코드를 추가했습니다. 저 좀 도와 주 시겠어요. – SaurabhJinturkar
당신의 분석에서 제안하는 것을해야한다고 말합니다. –