2010-04-07 12 views
46

Z tego co rozumiem, cała strona klienta aplikacji GWT jest konwertowana na Javascript podczas kompilacji, dlatego przypuszczam, że to pytanie dotyczy zarówno JavaScriptu, jak i możliwości oferowanych przez GWT.Nawlekanie w GWT (Client)

Mam kilka tuzin procesów, które będą musiały zostać zainicjowane w mojej aplikacji GWT, każdy proces będzie następnie nieprzerwanie wykonywać połączenia z serwerem. Czy GWT obsługuje wątki? Czy strona klienta GWT obsługuje wątki?

EDIT:

This link stany:

No JavaScript knowledge required If you’re just a user of the framework, 
which I am for the matter of discussion, you do not need to know JavaScript 
in order to write dynamic content, be it client-side such as rolling frames, 
docking panels or scheduled “multi-threading” tasks, or server-side calls 
using XMLHttpRequests (aka AJAX). 

lub zaplanowane „wielowątkowości” zadania, co to znaczy?

+1

up-głosowanie na pytanie nie jest wskazaniem, czy jest to użyteczne pytanie ale jeśli pytanie jest * dobrze napisany *, w tym jasny opis, dostarczany szczegóły i pewne oznaki, że autor już podjął próby znalezienia odpowiedzi na własną rękę. Teraz nie ** nie mówię, że twoje pytania nie spełniają tych wymagań, tylko wyjaśniają, że głosy za pytania i odpowiedzi są różne. –

Odpowiedz

34

JavaScript nie obsługuje wielowątkowości. Jednak GWT ma klasę "symulowania" wątków, która nie jest prawdziwa wielowątkowość, ale w większości przypadków robi to, czego potrzebujesz: com.google.gwt.core.client.Scheduler.ScheduledCommand. Technika opiera się na klasie timera, która wykonuje metodę po upływie określonego czasu.

Na przykład, umieszczając poniższy kod w was własny kod, metoda scheduleDeferred powróci bezpośrednio i kod kontynuuje po komendzie, natomiast metoda execute() jest wykonywany przy użyciu Timer:

Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
    public void execute() { 
     .. code here is executed using the timer technique. 
    } 
}); 

Można utworzyć powtarzającą się komendę RepeatingCommand, której można użyć do uruchomienia polecenia więcej niż jeden raz. Uruchom go pod numerem Scheduler.get().scheduleIncremental(), który wykona polecenie, dopóki metoda execute nie zwróci false. Możesz użyć tego do podzielenia zadań na zadania podrzędne, aby uzyskać lepsze działanie "przewlekane". Scheduler obsługuje niektóre dodatkowe metody, aby inaczej uruchomić zaplanowane polecenie. Aby uzyskać więcej informacji, patrz JavaDoc.

Zmieniono i zaktualizowano nową klasą GWT zamiast wycofanego DeferredCommand.

+1

Popraw mnie, jeśli się mylę, ale - mogę używać wątków Java po stronie serwera, prawda?Jeśli jest to poprawne, to myślę, że twoja odpowiedź bardzo mi pomogła, ponieważ myślę, że mógłbym przeprojektować mój system wokół DeferredCommand po stronie klienta i wątków Java po stronie serwera. – Federer

+0

Najprawdopodobniej nie można używać wątków w samym serwerze, ponieważ serwer blokuje tworzenie wątków. Ale każde wywołanie na serwer z przeglądarki zainicjuje "wątek", a wątek jest najprawdopodobniej potrzebny tylko wtedy, gdy chcesz rozpocząć proces, który nie jest związany z połączeniem z przeglądarki lub nie chcesz, aby połączenie było przeglądarka, aby czekać na odpowiedź z serwera. Ale ogólnie wszystko zależy od tego, co próbujesz zrobić ze swoją aplikacją. –

+2

co masz na myśli przez "* serwer nie pozwala tworzyć wątków" *? Który serwer? Nie mówię, że to dobra praktyka, ale jeśli Tomcat nie ma zasad bezpieczeństwa jawnie zapobiegających tworzeniu wątków, możesz utworzyć wątek po stronie serwera, jak w żadnym programie Java nie !? – SyntaxT3rr0r

0

JavaScript nie obsługuje wielowątkowości, więc niezależnie od tego, co robi GWT, wielowątkowość musi być wykonana wyłącznie po stronie serwera, ponieważ GWT może używać tylko funkcji, które są już dostępne po stronie klienta.

3

Jest praca nad Workerwerami jako częścią HTML5, która jest zaimplementowana w wielu przeglądarkach, ale nie we wszystkich (w szczególności w eksploratorze internetowym). Możesz użyć tych funkcji tam, gdzie są dostępne, ale powinieneś spojrzeć na model programowania javascript.

JavaScript ogólnie działa asynchronicznie. Żądania są odpalane iw pewnym momencie ich odpowiedzi są odbierane jako wydarzenie. Możesz mieć dużą liczbę oczekujących żądań w tym samym czasie. Będzie to jednak wymagało trochę przeprojektowania systemu.