JavaScript中处理事件的优先顺序是什么?
以下是按字母顺序排列的事件......
他们从事件队列中处理了什么顺序?
优先级不是先进先出(FIFO),所以我相信.
为了调试Swing应用程序中的奇怪行为,我想用我自己的实现替换AWT EventQueue.
这可能吗?怎么样?
万一你有兴趣:
实现将是一个围绕正常Eventqueue的简单包装器,进行一些日志记录.
我想要调试的问题是一个TableCellEditor,它可以在一个小的演示应用程序中正常工作,但是当放入真正的应用程序时,由于某些事件,会立即调用stopCellEditing.我希望能够访问该活动,以便了解它的来源.
在Java中,要创建和显示新的JFrame,我只需这样做:
public static void main(String[] args) {
new MyCustomFrameClass().setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
但是,我见过很多人这样做:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new MyCustomFrameClass().setVisible(true);
}
});
}
Run Code Online (Sandbox Code Playgroud)
为什么?有什么好处吗?
我很难理解它究竟是怎么process.nextTick回事.我以为我理解了,但我似乎无法复制我觉得这应该有效:
var handler = function(req, res) {
res.writeHead(200, {'Content-type' : 'text/html'});
foo(function() {
console.log("bar");
});
console.log("received");
res.end("Hello, world!");
}
function foo(callback) {
var i = 0;
while(i<1000000000) i++;
process.nextTick(callback);
}
require('http').createServer(handler).listen(3000);
Run Code Online (Sandbox Code Playgroud)
虽然foo是循环的,我会在几个请求发送,假设handler将排队几次身后foo有callback只在被排队foo完成.
如果我对这是如何工作正确的,我认为结果将如下所示:
received
received
received
received
bar
bar
bar
bar
Run Code Online (Sandbox Code Playgroud)
但它没有,它只是顺序的:
received
bar
received
bar
received
bar
received
bar
Run Code Online (Sandbox Code Playgroud)
我看到它foo在执行之前正在返回,callback这是预期的,但似乎callback是NEXT在队列中,而不是在队列的末尾,在所有请求进入后面.这是否有效?也许我只是不明白节点中的事件队列是如何工作的.请不要指我在这里.谢谢.
我目前正在查看Oracle网站上的EventQueue类:http: //download.oracle.com/javase/1.4.2/docs/api/java/awt/EventQueue.html 但我不知道什么时候应该用它?如果我的班级有两个或更多活动的听众,我应该使用它吗?
有人可以突出显示这两者之间的差异吗?两者都是必需的?!
我有一个应用程序,它同时使用,但想知道一个是否优于另一个.显然他们都接受了Runnable object,所以对我来说 - 我想我可以使用我喜欢的那个.
为什么这两个类似的功能在不同的类中?我知道有一个在awt和另一个Swing,但他们不是做同样的事情吗?
设置了ReferenceDataRequest后,我将它发送到EventQueue
Service refdata = _session.GetService("//blp/refdata");
Request request = refdata.CreateRequest("ReferenceDataRequest");
// append the appropriate symbol and field data to the request
EventQueue eventQueue = new EventQueue();
Guid guid = Guid.NewGuid();
CorrelationID id = new CorrelationID(guid);
_session.SendRequest(request, eventQueue, id);
long _eventWaitTimeout = 60000;
myEvent = eventQueue.NextEvent(_eventWaitTimeout);
Run Code Online (Sandbox Code Playgroud)
通常情况下我可以从队列中获取消息,但我现在遇到的情况是,如果我在应用程序的同一次运行中(通常在第十个左右)发出大量请求,我会看到一个TIMEOUTEventType
if (myEvent.Type == Event.EventType.TIMEOUT)
throw new Exception("Timed Out - need to rethink this strategy");
else
msg = myEvent.GetMessages().First();
Run Code Online (Sandbox Code Playgroud)
这些是在同一个线程上进行的,但是我假设我正在消耗并且不释放的某个地方有某些东西.
有人有任何线索或建议吗?
关于SO对BLP的API的引用并不多,但希望我们可以开始纠正这种情况.
是否可以以标准方式执行此操作?
这是场景.
开始在EDT中做一些昂贵的事情(EDT被阻止,直到昂贵的操作结束).
当EDT被阻止时,用户继续单击/拖动鼠标按钮.所有鼠标操作都记录在某处.
当EDT是免费的(用昂贵的东西完成)时,它开始处理鼠标事件.
我在步骤3中想要的是丢弃堆积的鼠标事件.在EDT免费之后,任何新的鼠标事件都应该以通常的方式处理.
关于如何实现这一点的任何想法.
PS:我不可能阻止EDT被阻止(我不控制程序中某些模块的行为).
编辑:如果我可以安全地调用"SunToolkit.flushPendingEvents()",那么在开始EDT中的昂贵操作之前,我总是可以放一个玻璃板.在昂贵的操作结束后,在EDT线程上,冲洗所有事件 - 他们将进入一个不做任何事情的玻璃窗格.然后让EDT正常工作.
EDIT2:我添加了一个SSCCE来演示这个问题.
public class BusyCursorTest2 extends javax.swing.JFrame {
public BusyCursorTest2() {
javax.swing.JButton wait = new javax.swing.JButton("Wait 3 seconds");
getContentPane().setLayout(new java.awt.GridLayout(2, 1, 0, 0));
getContentPane().add(wait);
getContentPane().add(new javax.swing.JToggleButton("Click me"));
setTitle("Busy Cursor");
setSize(300, 200);
setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
wait.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent event) {
final java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);
try {
//do something expensive in EDT
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
//do nothing
}
} finally {
switchToNormalCursor(BusyCursorTest2.this, timer);
} … 当 QApplication 处理关键事件时,我注意到一些不寻常的行为,这会危及我希望制作的小游戏。
按住一个键会导致keyPressEvent和 thenkeyReleaseEvent方法被重复(并且非常频繁地)调用,而不是触发keyPressEvent一次并等待释放键以触发另一个(这是期望的和公认的预期行为)。
这会导致巨大的性能问题,在某种程度上,按住多个键会导致某些键被程序完全忽略,大概是因为事件队列受到影响。
该程序演示了重复调用:
from PyQt4 import QtGui
import sys
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
def keyPressEvent(self, event):
print 'PRESSED'
event.accept()
def keyReleaseEvent(self, event):
print 'RELEASED'
event.accept()
app = QtGui.QApplication(sys.argv)
Window().show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
这个程序(我用来测试 Qt 游戏潜力的一个愚蠢的图形东西)演示了在按住现有键时忽略新按下的键。
from PyQt4 import QtGui
import sys
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.resize(100,300)
self.lower, self.upper = 10, -10
self.keys = [81, 65, 90, 87, 83, 88, 69, 68, 67, 82, 70, 86, 84, 71,
66, …Run Code Online (Sandbox Code Playgroud) 有没有更优雅的方式去做我在下面做的事情?也就是说,是否有比轮询和睡眠,轮询和睡眠更优雅的方式,等等,以便知道何时Runnable.run()通过调用方法invokeLater()?
private int myMethod() {
final WaitForEventQueue waitForQueue = new WaitForEventQueue();
EventQueue.invokeLater(waitForQueue);
while (!waitForQueue.done) {
try {
Thread.sleep(10);
} catch (InterruptedException ignore) {
}
}
return 0;
}
private class WaitForEventQueue implements Runnable {
private boolean done;
public void run() {
// Let all Swing text stuff finish.
done = true;
}
}
Run Code Online (Sandbox Code Playgroud) 在Swing中,GUI应该仅由EDT更新,因为GUI组件不是线程安全的.
我的问题是,如果我有一个专门用于更新特定组件的EDT以外的单个线程,并且我的程序中的任何其他线程都不能访问该组件,只有这个专用线程,可以吗?在我的情况下,我有一个JTable和一个线程从网络接收信息并更新表(不使用EventQueue.invokeLater).所有其他组件都从EDT更新.到目前为止我还没有看到任何问题,我想知道最终是否会出现一个错误.
更新 我的目的是实时更新表格.数据不断来自网络,为此我专门为表格提供1个线程,以便在它们到来时更新它.如果我使用SwingUtilities.invokeLater,这意味着当EDT可用时将更新该表.不应该将swing用于实时更新要求吗?
eventqueue ×11
java ×7
swing ×6
awt ×2
javascript ×2
bloomberg ×1
blpapi ×1
c# ×1
callback ×1
dom-events ×1
jframe ×1
keypress ×1
keyrelease ×1
node.js ×1
polling ×1
pyqt4 ×1
python ×1
real-time ×1
sleep ×1