진행 표시 줄 진행률 표시줄을 만드는 방법을 보여주었습니다. @abmayfield 질문하다 "응답하지 않음" vs. "아직 생각 중" 나에게 이것을 다시 방문하도록 촉구했다. 취소 버튼을 포함한 또 다른 테이크가 있습니다.
취소되지 않음
취소 버튼을 눌렀습니다.
progressBarWidth = 500;
progressUpdatesSeconds = 1 / 4; // 1/2 sec updates -> 1300ips, 1/30 -> 1000ips (1/4 compromise speed vs appearance)
cancel = 0; // clear the cancel flag
New Window( "Progressbar demo", //
V List Box( //
cats = Text Box( "" ), // output from the work function
t = Text Box( "", <<SETWRAP> ^workCalls/runSeconds^ ips" ) );
t << updatewindow; // this works without the wait
);
totalCats = 0;
dowork = Function( {},
x = "";
For( i = 1, i <= 1000, i += 1, x = x || "." );
totalCats += 1000;
cats << settext( Eval Insert( "total concatenations=^totalCats^" ) );
);
While( runSeconds < limitSeconds & !cancel, // change this to represent the work you are doing
// do some work, simulated by concatenating strings...
dowork();
// update the progressbar
workCalls += 1;
nowMicroSeconds = HP Time();
// how often does it need to update on the screen?
If( (nowMicroSeconds - recentUpdateMicroSeconds) / 1e6 > progressUpdatesSeconds,
// in this example I'm using a fixed time duration of "limitSeconds" to represent the
// amount of work to be done. And "runSeconds" to represent the amount of work done so far.
// Usually you'll have something other than time: number of rows in a table perhaps, or
// number of categories to make reports for. As long as you know how many total and how
// many completed, you can compute this fraction...
updateProgress( runSeconds / limitSeconds ); // change this to represent the fraction of work finished
recentUpdateMicroSeconds = nowMicroSeconds;
Wait( 0 ); // this wait is needed to let the cancel button work
);
runSeconds = (nowMicroSeconds - startMicroSeconds) / 1e6;
);
If( cancel, // test the cancel flag
Beep(); // audio flag
left << color( "dark red" ); // visual flag something is awry
right << color( "red" );
, //
updateProgress( 1.0 ); // people like to see the bar go to 100%
);
cancelButton << setbuttonname( "Close" ); // visual flag the button function is changed
cancelButton << setscript( (cancelButton << closewindow) ); // and what to do if the button is pressed
</SETWRAP>
JMP 15와 16 사이에서 테스트한 결과 16이 많은 이 문자열 연결 작업 부하에서 더 빠릅니다! 잘 하셨어요!
편집: JMP가 자체 취소 가능한 진행률 표시줄이 없는 플랫폼을 실행 중이고 오랫동안 실행되는 경우 도움이 되지 않습니다. 기술 지원은 진행률 표시줄에 대한 플랫폼 지원을 요청할 수 있는 좋은 장소입니다. 이것이 없으면 완료될 때까지 JMP를 중지할 방법이 없습니다(JMP를 강제로 닫는 것).
감사 해요 @Craige_Hales ! 나는 우연히 내 스크립트 중 하나에 진행률 표시줄(또는 이와 유사한 것)이 필요했기 때문에 이것을 가져와 내 필요에 맞게 약간 수정했습니다. 나는 그것을 클래스로 바꿨습니다 (일반적으로 JMP의 클래스 및 클래스에 대한 매우 초보자입니다). 관행 하나에 들어갈 수 있을 것 같았기 때문입니다. 또한 Natural Docs로 구문 분석할 수 있는 몇 가지 문서를 추가했습니다.
암호:
더보기...Names Default To Here(1);
//Modified from https://community.jmp.com/t5/Uncharted/Progress-Bar-with-Cancel-Button/ba-p/433560
Define Class(
/************************************************************************************************
Class: ProgressBar
---Prototype---
ProgressBar(int max_iteration = 1, int ith_iter_to_print = 5)
---------------
Creates brogress bar with cancel button. Pressing cancel will return 1 from
update(current_iteration) method this can be used to break out of loop.
Prototype:
> pb = New Object(ProgressBar(<max_iteration = 1>, <ith_iter_to_print = 5>)
> pb << update(current_iteration)
> pb << close()
Parameters:
max_iteration - Maximum iterations for the progress
ith_iter_to_print - ith values to print. Modulo(current_iteration, ith_iter_to_print)
Examples:
----------JSL-----------
pb = New Object(ProgressBar(10, 1));
For(i = 1, i <= 10, i++,
cancel_pressed = pb << update(i);
If(cancel_pressed == 1,
break();
);
wait(1);
);
pb << Close;
pb << Delete Class;
------------------------
************************************************************************************************/
"ProgressBar",
progressBarWidth = 500;
cancel = 0;
_init_ = Method({max_iteration = 1, ith_iter_to_print = 5},
this:cancel = 0;
this:max_iteration = max_iteration;
this:window_ref = this:create();
this:i_to_print = ith_iter_to_print;
this:start_time = HP Time();
);
create = Method({},
aa_nw = Associative Array();
nw = New Window("Gage Progress", //
V List Box(
Align("center"),
// cats = Text Box(""), // output from the work function
t = Text Box("", <<setwrap(500)), // status of the progressbar
H List Box( // Duct tape has a light side and a dark side. So does the progressbar.
left = Spacer Box(size(0, 10), color("light green")), //
right = Spacer Box(size(progressBarWidth, 10), color("dark green")), //
<<padding(5, 5, 5, 5), // gray wrapper
<<backgroundcolor("dark gray") //
), //
cancelButton = Button Box("Cancel", <<Style("Toggle")) // sets the cancel flag
)
);
aa_nw["nw"] = nw;
aa_nw["t"] = t;
aa_nw["left"] = left;
aa_nw["right"] = right;
aa_nw["cancelButton"] = cancelButton;
Return(aa_nw);
);
get_cancel_status = Method({},
Return(this:window_ref["cancelButton"] << get)
);
update = Method({current_iteration},
If(Modulo(current_iteration, this:i_to_print) == 0 | current_iteration == 1,
Try(
leftsize = Round(progressBarWidth * (current_iteration / this:max_iteration));
rightsize = progressBarWidth - leftsize;
this:window_ref["left"] << width(leftsize);
this:window_ref["right"] << width(rightsize);
cur_time = Round((HP Time() - this:start_time) / 10^6, 3); //could use formatting to keep same length
this:window_ref["t"] << settext(Eval Insert("Iteration ^current_iteration^ of ^this:max_iteration^. Total runtime: ^cur_time^s"));
// this:window_ref["t"] << settext(Eval Insert("^current_iteration^ iterations in ^char(runSeconds,6,3)^ seconds -> ^workCalls/runSeconds^ ips"));
this:window_ref["t"] << updatewindow; // this works without the wait
cancel_status = this:get_cancel_status();
, //lazy handling with catch
cancel_status = 1;
show(exception_msg);
);
);
/* If(cancel_status == 1,
this:window_ref["left"] << color("dark red");
this:window_ref["right"] << color("red");
);
*/
Return(cancel_status);
);
close = Method({},
Try(
this:window_ref["nw"] << Close Window
)
);
);
pb = New Object(ProgressBar(10, 1));
For(i = 1, i <= 10, i++,
cancel_pressed = pb << update(i);
If(cancel_pressed == 1,
break();
);
wait(1);
);
pb << Close;
pb << Delete Class;
Write(); 자연 문서는 다음과 같이 보일 것입니다.

포장하고싶네요 감사합니다!
귀하의 예에서 pb<
제가 놓친 부분도 지적해주셨어요 클래스 정의 사용 방법 : 나는 클래스 멤버를 정의 클래스 프로토타입에 명시적으로 배치해야 한다고 생각했지만, 이것: 그들도 만들 수 있습니다.
Define Class("bubble",
//not needed: m_xpos = .;
_init_ = Method( {x}, <BR />//because using explicit this: ...
this:m_xpos = x;