Multithreading GWT-刷新页面上的元素

Multithreading GWT-刷新页面上的元素,multithreading,gwt,Multithreading,Gwt,嗨,我周末和GWT一起玩,我真的很喜欢我所看到的 目前为止我有两个问题: 我不太了解我的应用程序的执行模式。我想 那是因为我不懂javascript。我假设有 运行javascript的浏览器中只有一个逻辑线程,并且 是更新显示的同一线程(忽略异步 请求)。因此,当我通过js向一个框架添加50个元素时 将所有图元添加到框架后,将显示这些图元。在里面 换句话说,在js完成执行之后。我有吗 正确的?有关于这个话题的文章吗 抱歉,这不是一个很好的例子,但它可能会回答我的问题 穿过在以下情况下(设计),

嗨,我周末和GWT一起玩,我真的很喜欢我所看到的 目前为止我有两个问题:

  • 我不太了解我的应用程序的执行模式。我想 那是因为我不懂javascript。我假设有 运行javascript的浏览器中只有一个逻辑线程,并且 是更新显示的同一线程(忽略异步 请求)。因此,当我通过js向一个框架添加50个元素时 将所有图元添加到框架后,将显示这些图元。在里面 换句话说,在js完成执行之后。我有吗 正确的?有关于这个话题的文章吗

  • 抱歉,这不是一个很好的例子,但它可能会回答我的问题 穿过在以下情况下(设计),我该怎么做: a) 将标签中的文本更新为“开始…” b) 做一些js和dom操作 c) 将标签中的文本更新为“完成!”

  • 目前,我看到的只是后遗症:我的dom操作和 “完成”。标签从不显示“开始…”

    如何在步骤a和步骤b之间强制刷新标签。我见过 一些帖子描述,一个人可以使用计时器,并以某种方式强制 要刷新的元素。但我不知道这是如何实现的

    期待您的建议。提前感谢。

    对1):是的,javascript是单线程的。您可以将长时间运行的操作实现为非阻塞操作。否则,您可能会遇到
    慢速脚本警告
    (请参阅下一点)

    To 2):查看
    IncrementalCommand
    类(描述了它的用法)。使用它,您可以将长时间运行的操作划分为小块较小的工作,并向用户显示进度更新。一个小例子:

    public class Starter implements EntryPoint {
    
        private Label text = new Label();
        private Label update = new Label();
    
        @Override
        public void onModuleLoad() {
            Button btn = new Button("hit me");
            btn.addClickHandler(new ClickHandler() {
    
                @Override
                public void onClick(ClickEvent event) {
                    text.setText("starting...");
                    startIncrementalWork();
                }
            });
    
            RootPanel.get().add(text);
            RootPanel.get().add(update);
            RootPanel.get().add(btn);
        }
    
        private void startIncrementalWork() {
            IncrementalCommand cmd = new IncrementalCommand() {
    
                private int count = 0;
    
                @Override
                public boolean execute() {
                    if (count >= 10000) {
                        text.setText("finished");
                        return false;
                    }
    
                    for (int i = 0; i < 100; i++) {
                        update.setText("count " + count);
                        count++;
                    }
                    return true;
                }
            };
    
            DeferredCommand.addCommand(cmd);
        }
    }
    
    公共类启动程序实现入口点{
    私有标签文本=新标签();
    私有标签更新=新标签();
    @凌驾
    moduleload()上的公共void{
    按钮btn=新按钮(“点击我”);
    btn.addClickHandler(新的ClickHandler(){
    @凌驾
    公共作废一次点击(点击事件){
    setText(“开始…”);
    开始基本工作();
    }
    });
    RootPanel.get().add(文本);
    RootPanel.get().add(更新);
    RootPanel.get().add(btn);
    }
    私人无效开始补充工作(){
    IncrementalCommand cmd=新的IncrementalCommand(){
    私有整数计数=0;
    @凌驾
    公共布尔执行(){
    如果(计数>=10000){
    text.setText(“完成”);
    返回false;
    }
    对于(int i=0;i<100;i++){
    update.setText(“计数”+计数);
    计数++;
    }
    返回true;
    }
    };
    DeferredCommand.addCommand(cmd);
    }
    }
    
    希望有帮助