gpt4 book ai didi

java - 如何禁用 SWT SelectionListener,直到单独的线程完成

转载 作者:行者123 更新时间:2023-11-30 07:04:55 26 4
gpt4 key购买 nike

我有一个带有 GUI 线程和 SQL 线程的应用程序。 GUI 中显示一棵树,单击树中的某个项目将启动一个单独的线程,该线程将启动 SQL 查询。查询完成后,树就会更新。

问题是,如果用户在获取线程完成之前再次单击树,树将在有机会完成获取数据之前更新,并且树将被错误更新。有没有办法在启动另一个线程之前禁用监听器,然后在线程完成后重新启用它以防止虚假查询?

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();
}
}

}

最佳答案

获取代码需要提供一个回调,该回调在查询完成后从“SQL 线程”内调用。

然后,UI 代码可以注册这样的回调,以在执行查询后重新启用树。

例如(在 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 仅允许在 UI 线程上执行的代码来操作小部件。因此,display.asyncExec() 安排给定的可运行对象“在下一个合理的机会”在 UI 线程上执行。

另请注意,在调用可运行对象时,具有可能已被处理的小部件。因此,在访问小部件之前,有必要在可运行对象中检查这种情况。

关于java - 如何禁用 SWT SelectionListener,直到单独的线程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40313280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com