2016-10-28 4 views
1

У меня есть приложение с потоком GUI и потоком SQL. В графическом интерфейсе отображается дерево, и нажатие на элемент в дереве запускает отдельный поток, который запустит SQL-запрос. По завершении запроса дерево обновляется.Как отключить SWT selectionListener до тех пор, пока не будет выполнен отдельный поток

Проблема заключается в том, что если пользователь снова нажимает на дерево до того, как поток выборки будет завершен, дерево будет обновляться, прежде чем у него будет возможность завершить выборку данных, и дерево будет обновлено некорректно. Есть ли способ отключить прослушиватель непосредственно перед запуском другого потока, а затем снова включить его после завершения потока для предотвращения ложных запросов?

private SelectionListener getTreeListener() 
{    

    //main tree listener that populates folder and report objects on the left side of the SashForm 
    SelectionListener l = new SelectionAdapter() 
    { 


     @Override 
     public void widgetSelected(SelectionEvent arg0) 
     { 

      Thread runThread = new FetchTreeChildrenThread(_es,_mgr,_PAI,_PE,_SelectedPub,Selected_Tree_Item); 
        runThread.start(); 
     } 
    } 

} 
+0

Если вы чувствуете, что ответ решил проблему, отметьте ее как «принятую», нажав зеленую галочку. Это помогает сосредоточиться на старых постах, у которых до сих пор нет ответов. –

ответ

0

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

См Thread.isAlive()

private SelectionListener getTreeListener() 
{ 
    //main tree listener that populates folder and report objects on the left side of the SashForm 
    SelectionListener l = new SelectionAdapter() 
    { 
     private Thread runThread; 

     @Override 
     public void widgetSelected(SelectionEvent arg0) 
     { 
      if (runThread == null || (!runThread.isAlive())) 
      { 
       runThread = new FetchTreeChildrenThread(_es,_mgr,_PAI,_PE,_SelectedPub,Selected_Tree_Item); 
       runThread.start(); 
      } 
     } 
    } 
} 
1

выборки код должен обеспечить обратный вызов, который вызывается внутри «SQL нити» после запроса завершено.

Тогда код пользовательского интерфейса может зарегистрировать такой обратный вызов для повторного включения дерева после выполнения запроса.

Например (в рамках метода widgetSelected):

Display display = new Display(); 
Runnable uiUpdateCode = new Runnable() { 
    @Override 
    public void run() { 
    if(!tree.isDisposed()) { 
     // re-attach selection listner 
    } 
    } 
}; 
Runnable doneCallback = new Runnable() { 
    @Override 
    public void run() { 
    if(!display.isDisposed()) { 
     display.asyncExec(uiUpdateCode); 
    } 
    } 
}; 
Thread backgroundThread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // ... execute query 
    doneCallback.run(); 
    } 
}); 
backgroundThread.start(); 

Обратите внимание, что позволяет SWT код, который выполняется в потоке пользовательского интерфейса для управления виджетами только. Следовательно, display.asyncExec() планирует выполнение данной runnable, выполняемой в потоке пользовательского интерфейса, «при следующей разумной возможности».

Также обратите внимание, что во время вызова runnable виджеты, которые могут быть удалены, могут быть удалены. Поэтому перед доступом к виджету необходимо проверить этот случай внутри исполняемого файла.

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

  • Нет связанных вопросов^_^