gpt4 book ai didi

java - 在 For 循环中 hibernate 或等待

转载 作者:太空狗 更新时间:2023-10-29 15:16:29 26 4
gpt4 key购买 nike

我正在尝试根据摩尔斯电码 (Text) 中的给定文本,将 LED 打开和关闭特定长度 (out_tic)。我试图用“postDelay”和 sleep() 或 wait() 来解决这个问题,但闪光灯的长度始终相同,否则应用程序会崩溃。我认为这是因为 Flash 在尚未关闭时被告知要启动。

cam = Camera.open();
Handler handler = new Handler();
for(int i=0;i<Text.length();i++){

if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
ledon();
handler.postDelayed(new Runnable() {
public void run() {
ledoff();
}
}, out_tic);


}
else if(Text.charAt(i)=='-'){
ledon();
handler.postDelayed(new Runnable() {
public void run() {
ledoff();
}
}, 3*out_tic);
}
else if(Text.charAt(i)=='/'){
if(Text.charAt(i-1)=='/'){

}
}

}

ledon() 和 ledoff() 方法只是设置参数并开始/停止预览。

感谢您的帮助!

适合我的新代码:

(由于 JRaymond)

final String Text = "./-..-/.-/--/.--./.-.././/";
final int out_tic = 200;

new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<Text.length();i++){

if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
flash(out_tic);
flashpause(out_tic);
continue;
}
else if(Text.charAt(i)=='-'){
flash(3*out_tic);
flashpause(out_tic);
continue;
}
else if(Text.charAt(i)=='/'){
flashpause(2*out_tic);
if(Text.charAt(i-1)=='/'){
flashpause(4*out_tic);
}
}
}
}
}).start();
}

private Handler handler = new Handler();
private void flash(final int sleeptime) {
handler.post(new Runnable() {
@Override
public void run() {
ledon();
}
});
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e){
}
handler.post(new Runnable(){
public void run() {
ledoff();
}
});
}

private void flashpause(final int sleeptime) {
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e){
}
}

private Camera cam;
private void ledon() {
cam = Camera.open();
Parameters params = cam.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(params);
cam.startPreview();
}
private void ledoff() {
cam.stopPreview();
cam.release();
}

最佳答案

我想我已经解决了您的难题 - 您所有的可运行程序都已发布,因此它们几乎同时发生。 postDelayed 从现在开始安排 Runnable 的时间,而不是从最后一个 Runnable 安排的时间开始。我认为您最好的解决方案是这样的,它将 LED 控制卸载到另一个线程:

cam = Camera.open();
Handler handler = new Handler();
new Thread(new Runnable() {
public void run() {
for(int i=0;i<Text.length();i++){
if(Text.charAt(i)=='.' ||Text.charAt(i)=='·') {
flash(out_tic);
continue;
}
else if(Text.charAt(i)=='-'){
flash(3 * out_tic)
continue;
}
// I don't quite understand what this does, but the same principles apply
else if(Text.charAt(i)=='/'){
//Warte 2*out_tic lang (1mal wurde schon gewartet)
if(Text.charAt(i-1)=='/'){

}
}
}
}
private void flash(int tic) {
handler.post(new Runnable() {
public void run() {
ledon();
}
});
try {
Thread.sleep(out_tic);
} catch (InterruptedException e) {
}
handler.post(new Runnable() {
public void run() {
ledoff();
}
}
}
});

请注意,上面的内容非常困惑,您可能想要四处移动并稍微清理一下 - 但我们的想法是让与 UI 不同的线程进行 hibernate ,然后在需要更改相机参数。

关于java - 在 For 循环中 hibernate 或等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com