gpt4 book ai didi

Java SWT 和无效的线程访问

转载 作者:搜寻专家 更新时间:2023-11-01 02:12:27 25 4
gpt4 key购买 nike

我看过 this但它不适用于我的代码。这是我的独特类(class):

public static void main(String[] args) {
try {
Main window = new Main();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}

public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}

protected void createContents() {
shell = new Shell(SWT.CLOSE | SWT.MIN | SWT.TITLE | SWT.ON_TOP);
shell.setSize(301, 212);
shell.setText("MyShell");
// ...Other contents...
btn = new Button(shell, SWT.NONE);
btn.setBounds(114, 151, 76, 25);
btn.setText("BUTTON!");
btn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
doSomething();
}
});
}

doSomething() 方法是另一个方法的调用者,如下所示:

private void doSomething()
{
Thread th = new Thread() {
public void run() {
threadMethod();
}
};
th.start();
}

当我点击我的按钮时,线程 0 引发“无效线程访问”,它指向 threadMethod() 的第一条指令(至于不访问 到 UI 小部件)。我试着用

包围我的按钮监听器
Display.getDefault().asyncExec(new Runnable() {
public void run() {
// ...
}
});

但它也不起作用。我需要 doSomething() 方法,因为它会在创建线程之前检查一些代码。这是 threadMethod()

private void threadMethod() 
{
String[] listItems = list.getItems();
String fileName;
Path source, target;
File folder = new File(dir + File.separator);
if (!folder.exists()) {
folder.mkdir();
}
try
{
for(int i = 0; i < list.getItemCount(); i++)
{

// do something with non UI widgets
}

list.removeAll();

}
catch(IOException | InterruptedException e)
{
//print error

}
}

为什么我有无效的线程访问?谢谢!

最佳答案

List 是一个 SWT 小部件,如果您在 UI 线程(在本例中是您的主线程)之外调用它的 getItems() 方法,您将得到一个 ERROR_THREAD_INVALID_ACCESS SWTException。这是在 List API 中定义的: ERROR_THREAD_INVALID_ACCESS - 如果不是从创建接收器的线程调用

创建接收器的线程是创建显示的线程。如果 Display 不存在,则第一次调用 Display.getDefault() 会创建一个。因此,调用 open() 方法的主线程是 UI 线程。如果您包装 threadMethod() 的内容,您的代码将起作用:

private void threadMethod() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
// threadMethod contents
}
});
}

然后它将在 UI 线程中执行。

关于Java SWT 和无效的线程访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15851562/

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