Bonjour,
J'ai travaillé sur le développement d'une application Java, réalisée avec Eclipse, sur un pc. L'application permet de se connecter à un serveur FTP et de transférer des fichiers vers ce serveur, tout en affichant une barre de progression qui évolue au fur et à mesure que le fichier est envoyé. L'envoie du fichier se fait dans un thread, et le calcul de la progression dans un autre. Ca fonctionne très bien lorsqu'on exécute l'application sur un pc.
Seulement voila, cette application doit également fonctionner sur Mac ce qui théoriquement ne devrait poser aucun soucis de portabilité, mais le soucis c'est que sous Mac, le thread de la barre de progression ne fonctionne pas. Le fichier s'envoie, le processus principal se met à jour, mais la barre de progression n'évolue pas du tout.
Phénomène encore plus curieux, si je mets un breakpoint, sur l'une des lignes contenues dans le run(), le débugger s'arrête correctement dans le thread, et la barre de progression se met à jour! Mais sinon en temps normal rien.
Pour tacher de régler ce problème, j'ai déjà tenté de supprimer les autres threads, jouer sur les priorités ou encore dédoubler les ressources communes, mais rien n'y fait. Je vous ajoute le code de la fonction en question à la suite, si vous avez la moindre indication, je suis preneur.
Merci d'avance
Moila
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 void UpdateProgressBar() { Thread oUpdateThread = new Thread() { public void run() { FTPManager oFTP = new FTPManager(); // While the instance is existing long iSize = new File(m_oNewMovie.GetLocalPath()).length(); while(m_oNewMovie.GetState() != StateMovie.ID_STATE_OK && m_oNewMovie.GetState() != StateMovie.ID_STATE_INVALID && m_oNewMovie.GetState() != StateMovie.ID_STATE_ERROR && m_oNewMovie.GetState() != StateMovie.ID_STATE_ABORD) { if(m_oNewMovie.GetState() == StateMovie.ID_STATE_RUNNING || m_oNewMovie.GetState() == StateMovie.ID_STATE_RETRY) { long iCurrentSize = 0; try { iCurrentSize = oFTP.FTPGetFileSize(m_oNewMovie); if(iCurrentSize > 0) { float iValue = (float)iCurrentSize/iSize; m_oDataLoad.setValue((int)(iValue * 1000)); m_oDataLoad.setString((int)(iValue * 100) + " %"); m_oDataLoad.validate(); m_oDataLoad.repaint(); } } catch (IOException e) { System.out.println("FTP : Impossible d'obtenir la taille"); } } } // To be sure the last "list" stop the progresbar at 99% if(m_oNewMovie.GetState() == StateMovie.ID_STATE_OK) { m_oDataLoad.setValue(1000); m_oDataLoad.setString("100 %"); } if(m_oNewMovie.GetState() == StateMovie.ID_STATE_ABORD) { try { oFTP.FTPDisconnect(); } catch (IOException e) { System.out.println("dÈco : "+e); } } } }; // Set the Thread as deamon oUpdateThread.setDaemon(true); // and go! oUpdateThread.setPriority(Thread.MAX_PRIORITY); oUpdateThread.start(); }
Partager