0

私はGWTを初めて使用し、大きな問題を抱えています。gwt/extjs gwt2.2.0 アプリがあります。毎秒の着信メッセージの量に関するリアルタイム情報を表示するグラフを作成する必要があります。システムモニターのようなもの。私が見つけた唯一の方法は、サーバーから messageQueueSize を呼び出すコードを追加し、それをエリア チャートに追加して timer.shedule(1000) でタイマー ブロックに追加することです。

$while(true) 

ブロック。アプリケーションを実行しようとすると、アプリケーションがループします (While がすべてのスレッドを占有するため)。この問題を解決するか、アプリのこの部分を実現するためのアイデアを見つけるのを手伝ってください。これが私がやろうとしていることのコードです:

$ public class ExampleChart extends ContentPanel{

    ArrayList<String> timeList = new ArrayList<String>();
    ArrayList<Long> queueSize = new ArrayList<Long>();
    private final ServerManagementAsync serverManagementSvc = GWT.create(ServerManagement.class);
      public ContentPanel createChart(final String customerId, boolean warrant){
       setHeading("Messages by domain");
       setFrame(true);
       setSize(550, 400);
       setLayout(new FitLayout());

       String url = "/gxt/chart/open-flash-chart.swf";
       final Chart chart = new Chart(url);

       chart.setBorders(true);

       timeList = getTimeList(timeList);
       while (warrant){
           Timer t = new Timer(){
               public void run(){
                   ExampleChart ec = new ExampleChart();
                   AsyncCallback<Long> ac = new AsyncCallback<Long>() {
                       @Override
                       public void onFailure(Throwable throwable) {
                       }

                       @Override
                       public void onSuccess(Long integer) {
                           timeList = getTimeList(timeList);
                           if (queueSize.size()<11){
                               queueSize.add(integer);
                           } else{
                               for (int i = 0; i<queueSize.size()-1; i++){
                                   queueSize.set(i,queueSize.get(i+1));
                               }
                           }
                           chart.setChartModel(getAreaChart(timeList, queueSize));
                           add(chart);
                           repaint();
                       }
                   };
                   serverManagementSvc.getMessageQueueSize(customerId, ac);
               }
           };
           t.schedule(2000);
       }
       chart.setChartModel(getAreaChart(timeList, queueSize));
       add(chart);
       repaint();
       return this;

    }

    public ArrayList<String> getTimeList(ArrayList<String> TimeList){
        ArrayList<String> timeList = TimeList;
        if (timeList.size() < 11){
            timeList.add(getCurrentTime());
        } else {
            for (int i = 0; i<timeList.size()-1; i++){
                timeList.set(i, timeList.get(i+1));
            }
            timeList.set(10, getCurrentTime());
        }
        return timeList;
    }

    public String getCurrentTime(){
        Date date = new Date();
        String hrs = Integer.toString(date.getHours());
        String min = Integer.toString(date.getMinutes());
        String sec = Integer.toString(date.getSeconds());
        return hrs + ":" + min + ":" + sec;
    }
    public ChartModel getAreaChart(ArrayList<String> dateList, ArrayList<Long> queueSize)
    {
        ChartModel cm = new ChartModel("Messages per domain", "font-size: 14px; font-family: Verdana;");
        cm.setBackgroundColour("#ffffff");
        XAxis xa = new XAxis();
        xa.setLabels(dateList);
        cm.setXAxis(xa);
        AreaChart area1 = new AreaChart();
        area1.setFillAlpha(0.3f);
        area1.setColour("#ff0000");
        area1.setFillColour("#ff0000");
        for (int n = 0; n<queueSize.size(); n++){
                area1.addValues(queueSize.get(n));
        }
        cm.addChartConfig(area1);

        return cm;
    }

}
4

2 に答える 2

1

'while(warrant)'の代わりに'if(warrant)'ステートメントを使用する必要があります。タイマーは2000ミリ秒ごとにrun()メソッドを繰り返し実行するため、ここでは「While」ステートメントは必要ありません。

前の呼び出しが戻ったかどうかを知らずに非同期呼び出しを起動しないでください。

whileブロックを次のコードブロックに置き換えます。

       boolean isAsyncCallReturned = true;
       if (warrant)
       {
             Timer t = new Timer()
             {
                public void run()
                {
                   if( isAsyncCallReturned )
                   {  
                      ExampleChart ec = new ExampleChart();
                      AsyncCallback<Long> ac = new AsyncCallback<Long>() 
                      {
                             @Override
                             public void onFailure(Throwable throwable) 
                             {
                             }

                             @Override
                             public void onSuccess(Long integer) 
                             {
                                    timeList = getTimeList(timeList);
                                    if (queueSize.size()<11)
                                    {
                                         queueSize.add(integer);
                                    } 
                                    else
                                    {
                                           for (int i = 0; i<queueSize.size()-1; i++)
                                           {
                                                 queueSize.set(i,queueSize.get(i+1));
                                           }
                                    }
                                    chart.setChartModel(getAreaChart(timeList, queueSize));
                                    add(chart);
                                    repaint();
                                    isAsyncCallReturned = true;
                             }
                    };
                    isAsyncCallReturned = false;
                    serverManagementSvc.getMessageQueueSize(customerId, ac);
                  }
                }
            };
            t.schedule(2000);
       }
于 2013-02-21T15:03:45.197 に答える
0

ありがとう、でも別の解決策を見つけました。タイマーを作成でき、t.shedule(2000) の代わりに t.scheduleRepeating(2000) を使用します。そのため、if() や while() は必要ありません。とにかくありがとうございました。必要に応じて、私に書いてください。作業コードを投稿します。

于 2013-02-25T14:14:05.670 に答える