模态对话后,SwingWorker publish()和process(List)乱序

问题描述 投票:1回答:1

[在复杂的Java应用程序中,我扩展了SwingWorker,因此可以在后台处理从套接字读取的内容。套接字提供了更新GUI所需的大量数据。

有一个特别的警告-写入套接字的服务器以非常特定的顺序来编写内容,而客户端则依赖该顺序。将其视为发送术语定义,然后使用术语。如果应用程序未首先获取定义,则会崩溃或显示错误数据。没问题,因为服务器要小心正确地执行操作,并且套接字是TCP,所以我可以按顺序交付。这很简单:我从Worker.doInBackground函数的套接字读取数据,对其进行解析并调用publish()。在Worker.process(List)中,我依次遍历列表,处理套接字给我的东西。都很好。

除非服务器发送了一些可以说服客户端弹出模式对话框的东西,否则一切都会很好,这可能发生在它向下发送的消息的早期。当模型框打开时,后台线程将继续读取套接字并调用publish(),这是预期的。但是worket.process(List)(请注意,这是Modal对话框中的代码)开始被调用,并且发生了异常混乱的事情。它很可能仍在处理最后一个传递给它的List的中间,并被处理Modal框的任何事件递归调​​用。]

我的笔记说,只在process(List)中做GUI东西是可以的。我认为在doInBackground()中执行GUI内容并不安全。因此,我认为弹出一个对话框需要在过程中发生(列表)。

是否有方法告诉对话框停止调用doInBackground()或process()?在关闭该对话框之前,我不需要或不需要执行任何操作。有没有更聪明的方法来完成我需要做的事情?服务器可以随时自由发送新内容,并且订单总是很重要,因此我看不出何时可以放一个对话框。

我试图进行同步,在打开对话框时保持锁定,并在调用publish()之前让doInBackground在锁定对象上等待。没有骰子-它们可能由同一线程运行,并且Java锁是递归的。 (也许如果不是,对话框将挂起。)

我可以想到一个可能的笨拙解决方法。我可以用序号标记事物到达doInbackground()的顺序,并且在处理中)我可以重新发布我用序号得到的任何东西,而序号太高了。但是,在关闭对话框之前,我可能会陷入死循环(“项目1129太高。重新发布。项目1129太高。重新发布...”)

正确的方法是什么?

[在复杂的Java应用程序中,我扩展了SwingWorker,因此可以在后台处理从套接字读取的内容。套接字提供了更新GUI所需的大量数据。有一个特别的警告-...

java process swingworker
1个回答
0
投票

我不确定您是否100%都在问我(让我知道我的回答是否是“ offtopic”,但我会重点介绍这一部分:

© www.soinside.com 2019 - 2024. All rights reserved.