On 02/02/2018 04:19, Krishna Addepalli wrote:
Hi Sergey,

"It does not guarantee but this wait + waitForIdle() should be enough."
If it is not guaranteed, how can we say it is enough?

Because it will flush the native queue a few times, then flush EDT, and then it will wait 100 ms(minimum).

"Take a look to the code which generates the OPEN_EVENT used in the fix(see 
Window.show()).
It is posted without relation to the native peer:"

This is incorrect, since before posting the OPEN_EVENT, there is a 
"super.show()" call which ultimately leads to AwtComponent::_Show function in 
awt_Component.cpp, which actually posts a message to show the window.

If it is incorrect then why do you need to wait when OPEN_EVENT will be dispatched at all, since you mention that "super.show()" call which ultimately leads to AwtComponent::_Show function". So AwtComponent::_Show will be called before the end of Window.show().

The approach which you used in the fix(wait for OPEN_EVENT) is identical to implementation of waitForIdle().
 - Both will post events(OPEN_EVENT/dummy) after Window.show();
 - Both will wait when it will be dispatched.

But only waitForIdle() will flush the native, and can do this a few time(EDT/native/EDT/native etc).

Also, before OPEN_EVENT, ComponentShown event is also posted(if there are 
active listeners to the component) which also seems to be coming from native 
side.
So, I think it is more appropriate to rely on OPEN_EVENT or even ComponentShown 
event, rather than having to use wait.

My point is that the fix and previous implementation is mostly identical. And if old implementation does not work then it is a bug somewhere in the robot. See example below which compare both cases:

==========
1) EDT: Window.setVisible()->Window.show()->Window.postWindowEvent()->
barrier.await();
2) Main: blocked by barrier.await();

So your code waits when the setVisible() will complete and some additional event
(OPEN_EVENT) will be dispatched by EDT.

==========
The usage of waitForIdle() should produce similar result:

1) EDT: Window.setVisible()->Window.show();
3) Main: post dummy event to EDT->waitLock.notifyAll();
2) Main: blocked in SunToolkit.waitForIdle() by waitLock.wait();

The old code waits when the setVisible() will complete and some additional event
(dummy) will be dispatched by EDT. But it also flush the native queue.

So it is still unclear why waitForIdle does not work.


--
Best regards, Sergey.

Reply via email to