空 while 循环永远不会在处理中退出

Empty while loop never exits in Processing

我正在尝试从网络摄像头捕捉两个连续的帧,我尝试按以下方式进行。

import processing.video.*;

Capture video;
PImage image1, image2; //Images à comparer
int videoVar = 1;

void setup() {
  size(800, 600);
  video = new Capture(this, Capture.list()[61]);
  video.start();
}

void draw() {
    image1 = video.get();
    int m = videoVar;
    while (m == videoVar) {
      //println(m);
    }
    image2 = video.get();
    //image(image1, 0, 0);
    //image(image2, width/2, 0);
}

void captureEvent(Capture video) {
  video.read();
  videoVar = videoVar*(-1);
}

问题是基本上应该充当自定义延迟的 while 循环永远不会自行退出。只有在 while 循环中有内容时才会这样做,例如 "print('m');"。问题是,打印需要时间,我希望我的程序尽可能快。

任何人都可以对正在发生的事情提出建议吗?

我希望 while 循环能够不断地自我循环,而不管它里面有什么。

你根本不应该使用循环作为延迟。您可以使用 delay() 函数。

但更好的是,您应该使用 millis() 函数或 frameCount 变量来检查是否已经过了一定的时间。或者你应该只设置一个你从 captureEvent() 函数设置的 boolean 值。

如果您仍然无法弄明白,请更具体地说明您在此处尝试执行的操作。

编辑: 只是为了好玩,你可以尝试在 videoVar 的声明前面添加关键字 volatile 吗?该行看起来像这样: volatile int videoVar = 1; 然后尝试不带任何内容的 while 循环。

但除此之外,我建议您将代码更改为如下所示:

boolean doThing = false;

void setup() {
  size(800, 600);
}

void draw() {
  if(doThing){
    // do the thing
    doThing = false;
  }
}

void captureEvent(Capture video) {
  doThing = true;
}

这只是一个示例,但希望它能演示该方法。或者,您可以使用 noLoop()loop() 函数:

void setup() {
  size(800, 600);
}

void draw() {
  // do the thing
  noLoop();
}

void captureEvent(Capture video) {
  loop();
}