2009-11-29 3 views
0

У меня есть следующее приложение в flex. Я хочу вызвать два разных удаленных объекта параллельно.Проблемы с параллельными вызовами для удаленных объектов

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> 
<mx:RemoteObject id="service1" destination="test1" /> 
    <mx:RemoteObject id="service2" destination="test2" /> 
    <mx:Button label="service1" click="{service1.method(1)}" /> 
    <mx:Button label="service2" click="{service2.method(2)}" /> 
    <mx:Button label="service1 AND service2" click="{service1.method(1);service2.method(2)}" /> 
</mx:Application> 

Каждый удаленный объект подключен к другой реализации Java, называемой TestCase1 и TestCase2. Поэтому я бы подумал, что я мог бы вызвать два объекта параллельно и выполнить их параллельно друг другу.

public class TestCase1 { 

public void method(int n) { 
     System.out.println("method(" + n + ") starts"); 
     try { 
      Thread.sleep(8000); 
     } catch(InterruptedException e) {} 
     System.out.println("method(" + n + ") ends"); 
    } 

} 

public class TestCase2 { 

public void method(int n) { 
     System.out.println("method(" + n + ") starts"); 
     try { 
      Thread.sleep(8000); 
     } catch(InterruptedException e) {} 
     System.out.println("method(" + n + ") ends"); 
    } 

} 

Теперь, что методы делают, это напечатать sth. когда они вызывают, затем подождите 8 секунд и напечатайте sth. после этого.

При каждом нажатии каждой кнопки он работает, оба метода запускаются параллельно. Однако, вызывая оба метода в одно и то же время, вы оставите одну службу ожидания со своим вызовом, пока не будет выполняться другая.

Как я могу избежать этого?

Thx Philipp

enter code here 
+0

Это не будет иметь значение с проблемой вы имеете, но только FYI вам не нужны скобки в обработчики событий. –

ответ

0

запросы RemoteObject не ставятся в очередь до следующего кадра выполнения, а затем отправлены через тот же запрос HTTP, то есть. несколько операций по одному и тому же запросу. Поэтому, когда вы звоните: service1.method(1);service2.method(2)
Обе операции проходят один и тот же HTTP-запрос. Первый из них вызывает обработку потока, которая запрашивает спать, в результате чего вторая операция не будет вызываться до тех пор, пока поток не возобновится.

Единственный способ избежать этого - убедиться, что каждая операция выполняется по собственному HTTP-запросу и, таким образом, получает собственный поток. Но помните, что вы получаете только два одновременных HTTP-запроса в большинстве браузеров. Поэтому, если вы делаете более двух запросов одновременно, вы все равно будете заблокированы и не будете параллельны за пределами двух параллельных операций.

Простой способ получить запросы произойдет на следующем кадре использовать callLater как:

service1.method(1); 
callLater(function():void { service2.method(2) }); 

Я считаю, что это приведет к тому, первая операция произойдет на следующем кадре, а вторая операция будет происходить на следующий кадр. Возможно, вам придется обернуть еще один callLater вокруг callLater, чтобы убедиться, что он попадает в кадр после первой операции.

+0

James, THX для объяснения. Я выполнил небольшую очередь, которая принимает служебные вызовы и передает их, а затем вызывает их по истечении определенного времени (100 миллисекунд). Это тоже работает. Теперь о параллельных вызовах. Это означает, что я не смог бы отправить несколько вызовов на mx: HttpService, не блокируя? Означает service1.send (params); service2.send (params); service3.send (params); Thx Philipp –

+0

Я уверен, что HTTPService работает так же, как RemoteObject в этом отношении. –

0

Если у вас много запросов - callLater не поможет, так как все запросы будут выполняться параллельно в следующем кадре. Дайте мне знать, что вы думаете об этой душевности: добавьте массив функции, который мы будем нажимать на обратный вызов, который нам нужно запускать на каждом кадре, и добавить событие lister: ENTER_FRAME, что на каждом входе в рамку появится одна функция из массива и выполнить его. Массив и событие будут в основном приложении.

Спасибо,

Смежные вопросы