自定义 SWT 组件中的阻塞操作
Blocking operation in custom SWT component
在自定义 SWT 组件中 运行 长时间操作的最佳方法是什么?
Objective: 我想用 SWT 构建一个邮件状态指示器。基本上,它应该根据返回的状态标志不断轮询服务并显示图像(为了简单起见,假设 MailState.NO_MAILS
或 MailState.NEW_MAILS
)。
问题: 我知道我不应该 运行 SWT GUI 线程中的阻塞操作。
那么让我的组件每隔 x 秒异步轮询一次服务或者(可能)使用阻塞 Future
而不会冻结我的界面的最佳方法是什么?
您可以在给定的毫秒数后使用Display.timerExec
到运行一个Runnable
:
Display.getDefault().timerExec(millisec, runnable);
注意:运行在用户界面线程中启用运行。
这不会重复,因此您需要再次调用 timerExec
以设置下一个 运行。
如果您的任务将阻塞很长时间,您将不得不 运行 在单独的线程中处理它。您可以使用 Display.asyncExec
从该线程更新用户界面:
Display.getDefault().asyncExec(runnable);
其中 runnable
是将尽快在用户界面线程中执行的 Runnable
。
在自定义 SWT 组件中 运行 长时间操作的最佳方法是什么?
Objective: 我想用 SWT 构建一个邮件状态指示器。基本上,它应该根据返回的状态标志不断轮询服务并显示图像(为了简单起见,假设 MailState.NO_MAILS
或 MailState.NEW_MAILS
)。
问题: 我知道我不应该 运行 SWT GUI 线程中的阻塞操作。
那么让我的组件每隔 x 秒异步轮询一次服务或者(可能)使用阻塞 Future
而不会冻结我的界面的最佳方法是什么?
您可以在给定的毫秒数后使用Display.timerExec
到运行一个Runnable
:
Display.getDefault().timerExec(millisec, runnable);
注意:运行在用户界面线程中启用运行。
这不会重复,因此您需要再次调用 timerExec
以设置下一个 运行。
如果您的任务将阻塞很长时间,您将不得不 运行 在单独的线程中处理它。您可以使用 Display.asyncExec
从该线程更新用户界面:
Display.getDefault().asyncExec(runnable);
其中 runnable
是将尽快在用户界面线程中执行的 Runnable
。