안녕 모두. 진행률 표시줄과 "취소" 버튼이 있는 창을 만들었습니다. 의도는 사용자가 프로그램 실행을 중지할 수 있도록 하는 것입니다. 취소를 누르면 오류가 발생하고 해결 방법을 모르겠습니다. 내 스크립트의 단순화된 버전은 아래와 같습니다.
Names Default to Here(1);
//Define progress window
pwin = NewWindow("Progress",
SB_L = SpacerBox(Size(0, 15), Color("Green")),
ButtonBox("Cancel",
pwin << Close Window;
Stop();
)
);
//Sample Loop
For(i=1, i<=10, i++,
SB_L << Size(i*10, 15); //update the progress bar
Wait(1); //rest of loop
);루프가 실행되는 동안 취소를 누르면 다음 오류가 발생합니다.
deleted object reference: SB_L << Size(i * 10, 15) in access or evaluation of 'Glue' , pwin = New Window("Progress",
SB_L = Spacer Box(Size(0, 15), Color("Green")),
Button Box("Cancel",
pwin << Close Window;
Stop();
)
); /*###*/For(i = 1, i <= 10, i++,
SB_L << Size(i * 10, 15);
Wait(1);
) /*###*/;취소 버튼을 누르면 진행 창이 닫히고 실행이 중지되어야 합니다. 그러나 적어도 한 번의 반복 동안 계속되는 것으로 보이며 For 루프의 SB_L << Size() 줄에서 실패합니다. 진행 창이 닫히고 SB_L이 삭제되었기 때문에 실패하지만 Stop() 명령이 실행되면 이 행이 실행되는 이유가 무엇입니까?
Stop() 명령 후에도 프로그램 실행이 계속되는 것이 맞습니까? 취소 버튼을 누른 후 SB_L << Size() 명령의 실행을 방지하려면 어떻게 해야 합니까?
세부:
JMP 프로 15.2.1
맥 OS 빅서 v11.6
감사 해요.
안녕하세요 @nikles . 이 최근 게시물을 확인하고 싶을 수도 있습니다. @Craige_Hales , 취소 버튼이 있는 진행률 표시줄 .
Ryan (및 Craige)에게 감사드립니다. 이것은 내가 확실히 고려하고 있는 옵션 중 하나이지만 기본 스크립트 본문의 if 절에 플래그를 보내야 합니다. 내 소원은 취소 버튼에서 Stop() 명령을 사용하여 프로그램 실행을 중지하는 것입니다. 내 질문을 재구성할 수 있습니다. Stop() 명령이 실행을 중지하지 않는 이유는 무엇입니까?
방금 다른 흥미로운 점을 발견했습니다. 취소 버튼 스크립트에서 "pwin << Close Window()" 명령을 주석 처리하면 취소 버튼이 더 이상 실행을 중지하지 않습니다. Stop() 명령은 버튼에서 실행될 때 For 루프를 중지할 수 없는 것 같습니다. 창을 제거하면 오류가 발생했기 때문에 취소 버튼은 이전에 실행을 중지할 수 있었습니다.
wait(n)은 JMP에서 가능한 한 피해야 할 필요악입니다. 대기하는 동안 대기를 호출하는 스크립트는 OS가 클릭을 인식하거나 열린 창을 표시하는 것과 같은 작업을 수행할 수 있는 동안 일시 중지됩니다. 클릭을 사용하여 첫 번째 스크립트의 환경에 영향을 주는 다른 스크립트(귀하의 예제)를 시작할 수 있기 때문에 이상한 일이 발생할 수 있습니다. 귀하의 예에서 stop()은 두 번째 스크립트를 중지합니다. 전역 플래그를 설정할 수도 있습니다. 프로젝트가 전역 변수를 추적하는 것에 대해 걱정할 만큼 큰 경우 네임스페이스를 사용할 수도 있습니다.
그렇다면 어떤 이상한 일이 일어날 수 있습니까? 대부분 창이 닫히거나 디스플레이 상자가 삭제됩니다. 특히 wait(1)을 사용하는 스크립트가 있고 0.5초 후에 버튼을 다시 클릭하는 클릭 함수를 상상해 보십시오. 스크립트의 두 번째 사본이 첫 번째 내부에서 실행 중입니다. 원래 wait(1)은 두 번째 스크립트가 완료될 때까지 반환되지 않습니다. 두 번째 스크립트가 버튼이 있는 창을 닫으면 원본 스크립트 주변은 어떤 환경인가요? (대기 전과 같지 않습니다!) 정당한 이유 없이 대기가 필요한 스크립트를 작성하지 마십시오. 대부분의 경우 displaybox<<