我正在编写一个Processing项目(Processing基于Java)。我想在另一个线程(主线程)中的一个线程内运行代码。
//This method runs in the main thread
public void draw() {
}
//This is a callback that runs in a separate thread
void addTuioObject(TuioObject tobj) {
rect(0, 0, 20, 10);
}
rect(0,0,20,10)
不在主线程中运行(它应该在屏幕上绘制一个矩形)。我想这是因为它在一个单独的线程中运行。我如何在主线程中运行此代码?
答案 0 :(得分:1)
最常见的解决方案是提供状态变量并根据当前状态制作draw()
方法。
状态变量可以像单个基本类型(例如布尔值)或复杂对象一样简单。
理念是:
draw()
,draw()
方法使用状态变量绘制屏幕。考虑两个例子:
1)简单状态(单个布尔变量)
// state variable
private boolean shouldPaint;
void draw() {
background(0);
fill(200);
rect(10, 10, 30, 30);
if (shouldPaint) {
rect(50, 10, 30, 30);
}
}
// called in other thread
someMethod() {
shouldPaint = !shouldPaint;
}
2)更复杂的状态
// state variable
private PVector[] vectors = new PVector[5];
private int index = 0;
void draw() {
background(0);
fill(200);
for (PVector v : vectors) {
if (v != null) {
rect(v.x, v.y, 10, 10);
}
}
}
// called by other thread
void someMethod() {
if (index >= vectors.length) {
index = 0;
}
// vector for current index value
PVector v = vectors[index];
if (v == null) {
vectors[index] = new PVector(index * 20, index * 20);
} else {
vectors[index].add(new PVector(30, 0));
}
index++;
}
请记住,draw()
方法每秒调用60次(如果是默认帧速率)。每个draw()
执行都会修改屏幕(像素)缓冲区。如果您想从屏幕中删除不需要的对象,您应该使用draw()
方法启动background(color)
清除整个缓冲区的方法。
答案 1 :(得分:0)
有几种方法可以做到这一点。取决于您实际想要实现的目标。如果你正在使用awt或swing你的绘图代码实际上不应该在主线程中运行,而是在awt线程中运行。您可以使用SwingUtils将工作分派给该线程。如果你真的想在另一个线程(例如main)中执行代码,你需要确保目标线程能够获取新的工作,例如从队列中。