2013-10-19 2 views
0

15 분마다 트리거해야하는 응용 프로그램에 GWT 타이머가 있습니다. 이것은 일반적으로 잘 동작합니다. 그러나 Gwt Fileupload 대화 상자가 열리면 TIMER가 트리거되지 않습니다.FileUpload 대화 상자가 열려있을 때 GWT 타이머가 작동하지 않습니다.

다음은 내 문제를 묘사 한 샘플 응용 프로그램입니다. 여기에 나는 모든 분에 대한 타이머를 예약했다. 이제 '파일 선택 ...'을 클릭하십시오. ButtonFileUploadDialog 상자가 열리 며 1 분 이상 열려 있어야합니다. 타이머가 작동하지 않습니다.이 샘플 코드는 IE8/9/10에서 확인했습니다.이 모든 브라우저에서 타이머가 트리거지고 있지 않습니다.

어떤 도움은 매우

을 감사
import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.user.client.Timer; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.ui.FileUpload; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.VerticalPanel; 

public class FileuploadEx implements EntryPoint{ 

@Override 
public void onModuleLoad() { 
    // TODO Auto-generated method stub 
    FileUpload upload = new FileUpload(); 
    upload.setName("Select File.."); 
    VerticalPanel panel = new VerticalPanel(); 
    panel.add(upload); 
    RootPanel.get().add(panel); 
    Timer t = new Timer() { 

     @Override 
     public void run() { 
      runAlert(); 
     } 
    }; 
    t.schedule(60000); 
} 

public void runAlert(){ 
    Window.alert("Timer triggered"); 
    Timer t = new Timer() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      runAlert(); 
     } 
    }; 
    t.schedule(60000); 
} 
} 

답변

2

자바 스크립트는 단일 스레드가, 경고 및 확인 같은 특정 대화 상자가 메인 스레드를 중지하고 타이머가 대화 상자가 닫히고 때까지 실행하지 않을 것입니다 .

그러나 파일 브라우저는 정상적으로 작동합니다. 적어도 내가 테스트 한 브라우저 (크롬과 FF 리눅스에서)에서 스레드를 멈추지 않으므로 브라우저 나 OS에서 문제가 될 수 있습니다.

gwtupload을 확인하면 큰 파일 (예제가 1Mb로 제한되어 있기 때문에 약 800MB)을 업로드 할 때 브라우저 선택기를 열면 실제로 타이머와 아약스가 사용되는 진행률 표시 줄이 열리고, 계속 업데이트됩니다.

[편집] 브라우저를 테스트하는 데 조금 더 시간을 소비 한 후에는 최신 브라우저가 작동하지만 IE는 항상 자바 스크립트 스레드를 중지합니다.

Microsoft에서 제품을 수정하지 않는 한 문제의 해결책이없는 것 같습니다. 코드에서 할 수있는 최선의 방법은 파일 선택기가 닫힐 때 세션을 만료시키는 것입니다. 세션이 만료 문제와 관련

,이 순서대로 할 것 : 클라이언트가 서버에 요청하는 경우 있도록

  1. 는 비활성 또는 고정 periode을 기반으로 서버 측에서 세션을 만료 그것은 오류가 발생하고 사용자를 로그인 화면이나 다른 것으로 가져옵니다. 이것은보다 신뢰성 있고 널리 사용되는 방법입니다.

  2. JS와 함께 가고 싶다면 세션 시작 시간을 var로 설정 한 다음 주기적 타이머를 실행하여 세션이 만료되었는지 확인하십시오. 파일 대화 상자가 열릴 때, 타이머가 실행되지 않지만, 즉시 사용자가 대화 상자를 닫을으로는 세션의 메시지가

final double limit = 1000 * 60 * 15; // 15 minutes 
    final double started = Duration.currentTimeMillis(); 

    Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() { 
     public boolean execute() { 
      double now = Duration.currentTimeMillis(); 
      if (now - started > limit) { 
       // your code to remove session objects here 
       Window.alert("Session expired"); 
       return false; 
      } 
      return true; 
     } 
    }, 1000); 
+0

내가 IE8에서이 기능을 테스트하고 있는데 여기가 아이오와 만료 얻을 것이다 작동 안함. – user2898388

+0

편집 내 대답 –

+0

IE8/9/10에서 테스트했지만 타이머를 실행할 수 없습니다. 내 문제를 묘사 한 샘플 코드를 추가하여 내 질문을 수정했습니다. 그것을 통해 봐주십시오 – user2898388

관련 문제