Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以不确定的时间显示任务的进度_Java_Task_Progress_Jprogressbar - Fatal编程技术网

Java 以不确定的时间显示任务的进度

Java 以不确定的时间显示任务的进度,java,task,progress,jprogressbar,Java,Task,Progress,Jprogressbar,我需要在progressbar中显示项目中任务的进度,在这种情况下是ProcBaseCentral方法(jfSelectorArchivo.getSelectedFile())的进度。此方法调用的sql查询需要不确定的时间才能完成。不确定模式适合我,但我需要查看一些进度,因为显示进度很重要 我设法在代码中取得了良好的进展,我可以显示百分比,但仍然没有找到衡量进展的方法。进度条不会在方法或函数的同一时间完成,我知道我的代码是错误的,我只是找不到一种方法来衡量进度。也许有人能帮我做个算法 下一个代码

我需要在progressbar中显示项目中任务的进度,在这种情况下是ProcBaseCentral方法(jfSelectorArchivo.getSelectedFile())的进度。此方法调用的sql查询需要不确定的时间才能完成。不确定模式适合我,但我需要查看一些进度,因为显示进度很重要

我设法在代码中取得了良好的进展,我可以显示百分比,但仍然没有找到衡量进展的方法。进度条不会在方法或函数的同一时间完成,我知道我的代码是错误的,我只是找不到一种方法来衡量进度。也许有人能帮我做个算法

下一个代码是到目前为止我所拥有的代码

private void bProcesar3ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        final int N = 100;        
        bProcesar3.setEnabled(false);
        class MyWorker extends SwingWorker<Double, Double> {

            @Override
            public Double doInBackground() throws InterruptedException {
                setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

                Thread t = new Thread(new Runnable() {
                    public void run() {
                        ProcesarSOC(jfSelectorArchivo.getSelectedFile());
                    }
                });
                int cntr = 1; //
                int cont = 0;
                double d1;
                double d2;
                double d3;
                t.start();
                while (t.isAlive()) {
                    d1 = N;
                    d2 = cont++;
                    d3 = d2 / d1;
                    d3 = d3 * 100;
                    if (d3 >= cntr) {
                        cntr++;
                        setProgress(cntr);
                        publish(Double.valueOf(cntr));                        
                    }
                }
                return Double.valueOf(0);
            }

            @Override
            protected void process(List<Double> chunks) {
                for (double d : chunks) {
                    System.out.println(": " + d);
                }
            }

            @Override
            public void done() {
                Toolkit.getDefaultToolkit().beep();
                setCursor(null);
            }
        }
        MyWorker task = new MyWorker();
        task.addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent e) {
                if ("progress".equals(e.getPropertyName())) {
                    jProgressBar1.setIndeterminate(false);
                    jProgressBar1.setValue((Integer) e.getNewValue());
                    System.out.println("**: " + e.getNewValue());
                }
            }
        });
        task.execute();
    }
private void bProcesar3ActionPerformed(java.awt.event.ActionEvent evt){
最终整数N=100;
bProcesar3.setEnabled(false);
类MyWorker扩展了SwingWorker{
@凌驾
public Double doInBackground()抛出InterruptedException{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor));
线程t=新线程(新的可运行线程(){
公开募捐{
ProcesarSOC(jfSelectorArchivo.getSelectedFile());
}
});
int-cntr=1//
int cont=0;
双d1;
双d2;
双d3;
t、 start();
while(t.isAlive()){
d1=N;
d2=cont++;
d3=d2/d1;
d3=d3*100;
如果(d3>=cntr){
cntr++;
setProgress(cntr);
出版(双重价值(cntr));
}
}
返回Double.valueOf(0);
}
@凌驾
受保护的无效进程(列表块){
for(双d:块){
System.out.println(“:”+d);
}
}
@凌驾
公众假期结束(){
getDefaultToolkit().beep();
设置光标(空);
}
}
MyWorker任务=新建MyWorker();
task.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共无效属性更改(属性更改事件e){
如果(“progress”.equals(例如getPropertyName())){
jProgressBar1.setUndeterminate(false);
jProgressBar1.setValue((整数)e.getNewValue());
System.out.println(“**:”+e.getNewValue());
}
}
});
task.execute();
}

谢谢您的时间。

如果时间不确定,您如何显示进度?如果你有一个百分比,那么显示一个进度条来表示它应该不难。根据“不确定”的定义,没有真正的方式显示进步。你也许能骗他们。让它花5秒钟填满一半的酒吧,然后再花5秒钟填满接下来的25%。然后再过5秒,填满接下来的12.5%。这样,条总是在增加,但越来越慢。当它结束时,只需跳到最后。@Cruncher,在那里我可以添加您的建议。这将有点棘手,可能需要相当多的代码。我甚至不知道补充@Cruncher的评论会有多好,你可以平均操作时间(包括最坏/最好的情况)并根据该时间设计进度策略