2017-05-06 12 views
0

화면에 로딩 바를 표시하면서 한 기능에서 일부 데이터를 처리하는 방법을 실험하고 있습니다. 예를 들어, 컴퓨터에 약 5 초가 걸리는 프로세스 인 어레이에 많은 값을 추가합니다. 나는 다음과 같은 코드가 있습니다처리 3 - 함수에서 draw()를 호출해도 화면이 업데이트되지 않습니다.

ArrayList<String> strs = new ArrayList<String>(); 
String state; 
float counter; 

void setup() { 
    size(640, 480); 
    state = "load"; 
    noStroke(); 
} 

void draw() { 
    if (state.equals("load")) { 
    load(); 
    } else if (state.equals("loading")) { 
    background(255); 
    fill(255, 0, 0); 
    rect(0, height/2-25, map(counter, 0, 10000000, 0, width), 50); 
    } else if (state.equals("play")) { 
    background(0, 255, 0); 
    } 
} 

void load() { 
    state = "loading"; 
    for (int i = 0; i < 10000000; i++) { 
    strs.add(str(pow(i, 2))); 

    if (i % 1000 == 0) { 
     counter = i; 
     draw(); 
    } 
    } 
    state = "play"; 
} 

을하지만 난 그냥 녹색 화면을 얻을 때까지 약 5 초 동안 (즉, 배경 불려 가지 않은 (255)를 나타내는) 회색 화면을 얻을. 나는 물론, 같은과 코드를 대체 할 수있는 :

ArrayList<String> strs = new ArrayList<String>(); 
String state; 
int counter; 

void setup() { 
    size(640, 480); 
    state = "load"; 
    noStroke(); 
    counter = 0; 
} 

void draw() { 
    if (state.equals("load")) { 
    float theMillis = millis(); 
    while (millis()-theMillis < 1000.0/frameRate && counter < 10000000) { 
     strs.add(str(pow(counter, 2))); 
     counter++; 
    } 
    if (counter >= 10000000) { 
     state = "play"; 
    } 

    background(255); 
    fill(255, 0, 0); 
    rect(0, height/2-25, map(counter, 0, 10000000, 0, width), 50); 
    } else if (state.equals("play")) { 
    background(0, 255, 0); 
    } 
} 

그리고이 간단한 예를 들어 일 것입니다,하지만 난 명시 적으로에 따라 같은 함수를 호출 할 때 일) (그리려고 노력하고 있어요 load()의 복잡성 (실제로 프로젝트에서 작동하려고하는 것은 파일을 열고 압축 해제하고 JSONArrays 및 ArrayLists를 처리하는 250 개 이상의 행입니다.) draw 함수를 draw() 내부의 청크로 나눌 수 있습니다. 악몽 일세. 어쨌든 함수 내부에서 화면을 업데이트 할 수 있습니까? 모든 당신의 도움 :)이 draw() 기능이 완료 될 때까지

답변

1

당신이 발견하고 따라가, 처리가 실제로 화면을 업데이트하지 않습니다 사전에

감사합니다. 따라서 draw() 함수가 Processing에 의해 호출되고 그 프레임 내부에서 draw() 함수를 호출하게됩니다. 그러나 draw()에 대한 첫 번째 호출이 아직 완료되지 않았으므로 화면이 업데이트되지 않습니다. draw()에 대한 모든 통화가 완료되고 첫 번째 통화 (처리 완료 됨)가 완료 될 때만 업데이트됩니다.

draw()과 같이 자신을 호출하는 것은 대개 매우 나쁜 생각입니다. 일반적으로 시간이 지남에 따라 업데이트되는 변수를 사용하여 각 프레임을 표시하는 내용을 변경해야합니다.

또 다른 옵션은 파일을로드하는 별도의 스레드를 사용하여 그리기 스레드를 계속 진행하는 것입니다.

+0

끝에'load()'와'loop()'의 시작 부분에'noLoop()'을 추가하려고 시도했는데 아무 것도 변경하지 않은 것 같았습니다. 그런 식으로'draw()'을 호출했을 때 이미 실행 중일 때 호출 할 수 있습니다. –

+0

@VladimirShevyakov'noLoop()'과'loop()'를 호출하면'draw()'의 첫 번째 호출이 아직 완료되지 않았다는 사실은 바뀌지 않습니다. –

+0

아. 글쎄 사실 실제로'thread() '를 사용하여 문제를 해결할 수있었습니다. –