2017-02-21 1 views
-2

J'ai un programme d'écoute d'action sur un lecteur multimédia utilisant vlcj. Quand j'exécute le programme en mode débogage, l'écouteur d'action se déclenche quand la vidéo est finie mais quand je l'exécute normalement en éclipse, il ne se déclenche pas.Le programme d'écoute d'action ne fonctionne qu'en mode débogage

Mon action auditeur

public static void youtubeGui(){ 

    Main.playing = true; 
    final JFrame f = new JFrame(); 
    f.setLocation(100,100); 
    f.setSize(1000,600); 
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    f.setVisible(true); 

    Canvas c = new Canvas(); 
    c.setBackground(Color.black); 
    JPanel p = new JPanel(); 
    p.setLayout(new BorderLayout()); 
    p.add(c); 
    f.add(p); 

    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(),"C:\\Program Files\\VideoLAN\\VLC"); 
    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 

    MediaPlayerFactory mpf = new MediaPlayerFactory(); 
    EmbeddedMediaPlayer emp = mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(f)); 
    emp.setVideoSurface(mpf.newVideoSurface(c)); 

    emp.setPlaySubItems(true); 
    String str = Insert.videoQueue.peek(); 
    emp.prepareMedia(str); 
    emp.play(); 
    Main.playing = true; 
    try { 
     TimeUnit.SECONDS.sleep(4); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    emp.addMediaPlayerEventListener(new MediaPlayerEventAdapter() { 
     @Override 
     public void finished(MediaPlayer mediaPlayer) { 
      Insert.videoQueue.remove(); 
      System.out.println("aaaaa"); 
      f.setVisible(false); 
      f.dispose(); 
      Main.playing = false; 
     } 
    }); 

} 

Vérification de la nouvelle méthode des inserts

public static void addCheck(String locationIn) throws IOException { 

    String fileLine = ""; 
    String a = ""; 

    while (true) { 
     Scanner inFile = new Scanner(new FileReader(
     locationIn)); 
     while (inFile.hasNext()) { 
      fileLine = inFile.nextLine(); 
     } 

     if (fileLine.contains("watch?v=") && fileLine.contains("!add") && !fileLine.equals(a)) { 
      a = fileLine; 
      String result = fileLine.substring(fileLine.indexOf("[URL]") + 5, fileLine.indexOf("[/URL]")); 
      videoQueue.add(result); 
      result = ""; 
      if(Main.playing == false){ 
       Gui.youtubeGui(); 
      } 
     } 

     inFile.close(); 
    } 
} 
+1

Je suppose que vous avez un problème de threading graphique, que votre interface graphique est bloquée en raison du code de longue durée qui s'exécute sur le thread d'événement de l'interface graphique, mais je serai sacrément si je peux le prouver Je ne comprends pas complètement votre code. Veuillez envisager de créer et d'afficher un [mcve] valide. –

+0

En outre, si vous formatez mieux votre code pour qu'il respecte les normes Java, il nous sera plus facile à tous de comprendre et de lire. –

+0

J'ai formaté votre code pour plus de lisibilité, mais dans le futur je vous recommande fortement de le faire vous-même, en particulier en donnant à votre code les indentations appropriées, généralement 4 espaces par bloc, et en vérifiant que même niveau d'indentation. Le formatage est très important car si votre code n'est pas dans un format standard accepté, il n'est pas très lisible, et s'il n'est pas lisible, il est difficile de déboguer et de comprendre. –

Répondre

0

Je devine que je soupçonne que votre code affiché ne dit pas toute l'histoire.

J'ai vu le garbage collector se comporter différemment lors de l'exécution du mode normal vs débogage dans Eclipse.

Si vous regardez dans votre méthode youtubeGui, vous déclarez mpf et emp comme variables de segment locales. Lorsque cette méthode se termine, il ne semble pas y avoir quoi que ce soit d'autre qui maintient ces deux variables épinglées pour que les objets référencés deviennent éligibles pour la récupération de place.

Si votre objet emp était effectivement collecté, cela pourrait expliquer pourquoi vous ne voyez jamais l'écouteur être activé. En mode débogage, la récupération de place peut avoir été différée alors qu'en mode non-débogage elle s'exécute plus tôt.

Vous pensez peut-être que le lecteur multimédia a pu être récupéré parce que la vidéo est toujours en cours de lecture? Eh bien, le lecteur multimédia a créé ressources natives en dehors de de la JVM et rien n'a explicitement détruit ces ressources natives simplement parce que l'objet Java media player a été récupéré. Ce qui se produirait habituellement alors quelque temps indéterminé plus tard est un accident indigène.

Je vous suggérerais donc de réorganiser votre code pour que vous ayez quelque chose qui vous permette de vous référer à votre lecteur multimédia (et peut-être aussi à l'usine de lecteur multimédia).

+0

Merci l'homme, c'est fait le tour! –