Bonjour à tous !
Je fais une appli super standard basée sur RCP. Au lancement, cette appli ouvre un thread de communication avec le serveur.
Le serveur envoie des objets dont je souhaite afficher le contenu dans mes vues.
Pour faire simple, je commence juste à afficher des String recues du serveur dans une vue "de logs".
Problème : le thread qui recoit les messages n'est pas celui qui fait tourner le workbench.
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
Ce code ne peut donc pas fonctionner depuis le thread de communication avec le serveur... le getActiveWorkbenchWindow() etant lié au thread.
Qu'à cela ne tienne, je me dis que je peux toujours récuperer directement le pointeur vers l'instance de ma vue.
Dans le constructeur de ma vue, je fais stocker dans un objet de "contexte général" le pointeur this (de la vue).
Dans mon thread de communication, je recupere (avec spring) l'objet de "contexte" et appelle la méthode pour ajouter mon texte dans la fenetre (un append tout simple avec une String, ca casse pas des briques).
Bis repetita :
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Exception in thread "Thread-1" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3563)
at org.eclipse.swt.SWT.error(SWT.java:3481)
at org.eclipse.swt.SWT.error(SWT.java:3452)
at org.eclipse.swt.widgets.Widget.error(Widget.java:432)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:326)
at org.eclipse.swt.widgets.Text.append(Text.java:250)
at ramses.view.LogView.append(LogView.java:44)
at ramses.service.RMSLogViewService.append(RMSLogViewService.java:12)
at ramses.form.RMSMessageForm.displayRMSMessageRequest(RMSMessageForm.java:31)
at ramses.thread.communication.RMSSocketThread.readSocket(RMSSocketThread.java:107)
at ramses.thread.communication.RMSSocketThread.run(RMSSocketThread.java:82) |
Je regarde le source de Eclipse, et Ho! surprise, checkWidget() vérifie que l'appelle se fait bien depuis le thread qui l'a lancé... (ce qui n est pas le cas!)
Ce problème est plus que "simple" dans l'idée, et très récurrent je n'en doute pas... Mais je suis novice en client lourd/RCP (car habitué à faire du struts) donc je n'ai pas vraiment d'idée sur comment faire...
Qui aurait une petite idée?
Merci d avance !
Partager