- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在尝试学习如何创建延迟时,我进行了研究并发现主要答案是使用 Handler/Runnable/postDelayed。
Handler handler=new Handler();
final Runnable r = new Runnable()
{
public void run()
{
delayedMethod();
}
};
handler.postDelayed(r, 1000);
这在一段时间内工作正常,但我又添加了一些正在发生的事情,现在它们有时会以错误的顺序发生。
这组事件:
paintScreen1()
...
delayedPaintScreen2()
...
paintScreen3()
搞砸了(有时)并这样做:
paintScreen1()
...
paintScreen3()
...
delayedPaintScreen2()(最后运行并被 paintScreen3 的 Action 弄乱)
似乎没有另一种创建延迟的好方法 - 一种不创建线程的方法。
为了确保代码事件以正确的顺序运行,我尝试过的解决方案:
0 将主进程放在一个大的同步块(synchronized block)中。
1 将synchronized关键字放在主进程涉及的每个方法的方法名中。
2 仅将 synchronized 关键字放在 Runnable 中的方法上。
3 去掉 Handler/Runnable/postdelayed 并替换为 handler.sendEmptyMessageDelayed(0,1000)
4 创建一个 Handler 实例变量,供每个 Handler/Runnable block 使用(与 Handler handler1、handler2、handler3 等相对)
5
Handler handler=new Handler();
final Runnable r = new Runnable()
{
public void run()
{
waitOver = true;
}
};
handler.postDelayed(r, 1000);
while (waitOver == false) {
}
delayedMethod();
waitOver = false;
我的下一次尝试可能是尝试以某种方式使用 Thread 类,以便我可以调用 thread.join()。如果失败,接下来的事情将非常漫长和复杂,我担心。
有什么建议吗?
任何简单的解决方案示例?
谢谢
编辑:我可能对 Handler/Runnable 是否会导致文字线程感到困惑。
编辑:这是一个游戏。用户移动,屏幕更新以显示移动,计算表明他们得分了,重新为屏幕上的框着色,添加延迟以允许用户看到他们的点,然后调用方法删除彩色方 block ,当该方法完成并我们返回调用它的方法(包含 Handler/runnable),代码继续向下调用另一个方法,该方法导致棋盘的随机方 block 变成紫色。所以它应该发生用户移动,重绘以显示得分,延迟以便用户可以看到得分,重绘以删除方 block ,然后随机紫色方 block 发生。有时会发生什么(据我所知)是随机的紫色方 block 会在它应该执行之前执行,选择得分的方 block 之一,干扰,然后清理方法变得困惑并且无法清理。
主要方法(){
...
如果(得分){
squaresglow();
...
//延迟以便用户可以在清理发生之前看到发光
处理程序可运行
清理();
后延迟
...
紫色方 block ();
}
我希望这不会更加困惑。 purpleSquare 在清理之前运行,事情搞砸了。
编辑:试过这个:6
CountDownLatch doneSignal = new CountDownLatch(1);
Handler handler=new Handler();
final LatchedRunnable lr = new LatchedRunnable(doneSignal);
handler.postDelayed(lr, COMPUTER_MOVE_DELAY);
try {
doneSignal.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
class LatchedRunnable implements Runnable {
private final CountDownLatch doneSignal;
LatchedRunnable(CountDownLatch doneSignal) {
this.doneSignal = doneSignal;
}
public void run() {
delayedProcess();
doneSignal.countDown();
}
}
7
ExecutorService executorService = Executors.newFixedThreadPool(5);
final CountDownLatch latch = new CountDownLatch(1);
executorService.execute(new Runnable() {
public void run() {
try {
Looper.prepare();
Handler handler=new Handler();
final Runnable r = new Runnable()
{
public void run()
{
delayedMethodCleanupCalc();
}
};
handler.postDelayed(r, 4000);
} finally {
latch.countDown();
}
}
});
try {
latch.await();
delayedMethodPaintScreen();
} catch (InterruptedException e) {
// todo >> handle exception
}
最佳答案
purpleSquare runs before cleanup and things get screwed up
mainmethod() {
...
if (pointscored) {
squaresglow();
...
//delay so user can see the glow before the cleanup happens
Handler-runnable
cleanup();
postdelayed
}
...
purpleSquare();
}
你这里有一个设计缺陷。将 Handlers 视为一个消息队列,只要处理器决定处理消息,它就会“稍后”执行代码,将 postDelayed 视为将该消息填充到队列底部的一种不准确的方式。如果您调用 postDelayed 并且当前方法中仍有代码行要执行,那么这些行很有可能会在收到 postDelayed 消息之前执行。
您要做的是确保在 pointscored 例程完成其工作后调用 purpleSquare(),这可能需要等待它完成。在这种情况下,PostDelaying 到消息队列不是你应该做的。您应该使用的是信号量和 pointScored 线程。
考虑以下代码设计:
final Runnable pointScoredTask = new Runnable() {
public synchronized void run() {
try {
squaresglow();
//...
Thread.sleep(2500); //2.5 sec before cleanup occurs
cleanup();
} catch (InterruptedException e) {
}
notify(); //make sure we call notify even if interrupted
}
};
void mainmethod() {
//...
if (bPointWasScored) {
synchronized (pointScoredTask) {
try {
Thread psThread = new Thread(pointScoredTask,"pointscored");
psThread.start(); //thread will start to call run(), but we get control back to avoid race condition
pointScoredTask.wait(6000); //wait no more than 6 sec for the notify() call
} catch (InterruptedException e) {
}
}
//if a point was scored, nothing past this line will execute until scoreglow has been cleaned up
}
//...
purpleSquare();
//...
}
我知道您宁愿避免线程,但有些东西在您使用它们时会工作得更好。试试上面的设计,看看是否能解决您遇到的同步问题。
关于android - 处理程序/可运行延迟有时会产生不同步的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787523/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!