- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
(我讨厌不得不用这样的标题。但我找不到更好的标题)
我有两个类和两个线程。第一个检测两帧之间的运动:
void Detector::run(){
isActive = true;
// will run forever
while (isActive){
//code to detect motion for every frame
//.........................................
if(isThereMotion)
{
if(number_of_sequence>0){
theRecorder.setRecording(true);
theRecorder.setup();
// cout << " motion was detected" << endl;
}
number_of_sequence++;
}
else
{
number_of_sequence = 0;
theRecorder.setRecording(false);
// cout << " there was no motion" << endl;
cvWaitKey (DELAY);
}
}
}
第二个将在开始时录制视频:
void Recorder::setup(){
if (!hasStarted){
this->start();
}
}
void Recorder::run(){
theVideoWriter.open(filename, CV_FOURCC('X','V','I','D'), 20, Size(1980,1080), true);
if (recording){
while(recording){
//++++++++++++++++++++++++++++++++++++++++++++++++
cout << recording << endl;
hasStarted=true;
webcamRecorder.read(matRecorder); // read a new frame from video
theVideoWriter.write(matRecorder); //writer the frame into the file
}
}
else{
hasStarted=false;
cout << "no recording??" << endl;
changeFilemamePlusOne();
}
hasStarted=false;
cout << "finished recording" << endl;
theVideoWriter.release();
}
boolean 记录被函数改变:
void Recorder::setRecording(bool x){
recording = x;
}
目标是在检测到运动后开始录制,同时防止程序开始录制两次。
真正奇怪的问题是,老实说,我脑子里没有任何意义,代码只有在我计算出 boolean 记录(标有“++++++”)时才能工作。 Else 记录永远不会更改为 false,else 语句中的代码永远不会被调用。
有没有人知道为什么会这样。我仍然只是从 C++ 开始,但这个问题对我来说真的很奇怪..
最佳答案
我想你的变量isThereMotion
和 recording
是 bool
类型的简单类成员.
默认情况下,对这些成员的并发访问不是线程安全的,您将面临竞争条件和各种奇怪的行为。
我建议像这样声明这些成员变量(只要你能使用最新的标准):
class Detector {
// ...
std::atomic<bool> isThereMotion;
};
class Recorder {
// ...
std::atomic<bool> hasStarted;
};
等等
背后的原因是,即使读/写一个简单的 boolean 值也会拆分成几个应用于 CPU 的汇编程序指令,并且这些指令可能会在中间被调度以用于进程的线程执行路径更改。使用 std::atomic<>
提供类似临界区的东西,用于自动对此变量进行读/写操作。
简而言之:将旨在从不同线程并发访问的所有内容都设为原子值,或者使用适当的同步机制,如 std::mutex
.
如果您不能使用最新的 c++ 标准,您或许可以使用 boost::thread
来解决问题以保持代码的可移植性。
注意:
从你的评论来看,你的问题似乎是针对 Qt 框架的,有许多机制可以用于同步,例如提到的 QMutex
.
为什么 volatile
在多线程环境中没有帮助?
volatile
防止编译器仅通过假设以前按顺序设置的值来优化实际的读取访问。它不会阻止线程在实际检索或写入值时被中断。
volatile
应该用于读取可以独立于顺序或线程执行模型更改的地址(例如总线寻址的外围硬件寄存器,其中硬件主动更改值,例如 FPGA 在寄存器接口(interface)上报告当前数据吞吐量)。
在此处查看有关此误解的更多详细信息:
Why is volatile not considered useful in multithreaded C or C++ programming?
关于c++ - 使用两个线程和 boolean 值的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684400/
我有这种来自 Google map 自动完成的奇怪行为(或者我可能错过了某事)...想法?奇怪的: 您在输入中输入某物,例如“伦敦” 您按 [ENTER] 你按下 [CLEAR] 按钮 你点击进入'输
这段代码与《Learning Java》(Oracle Press Books)一书中的代码完全一样,但它不起作用。我不明白为什么它不起作用,它应该起作用。我用 OpenJDK 和 Sun JDK 7
示例 1 中究竟发生了什么?这是如何解析的? # doesnt split on , [String]::Join(",",("aaaaa,aaaaa,aaaaa,aaaaa,aaaaa,aa
我需要获得方程式系统的解决方案。为此,我使用函数sgesv_()。 一切都很好,它使我感到解决方案的正确结果。 但是我得到一个奇怪的警告。 警告:从不兼容的指针类型传递'sgesv_'的参数3 我正在
我目前在制作动画时遇到一个奇怪的问题: [UIView animateWithDuration:3 delay:0
alert('works'); $(window).load(function () { alert('does not work'); });
我的代码: public class MyTest { public class StringSorter implements Comparator { public
我正在学习 JavaScript。尝试理解代码, function foo (){ var a = b = {name: 'Hai'}; document.write(a.name +''
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这按预期工作: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ 这样做: [dgorur@ted ~]$ env -i which date which: no
struct BLA { int size_; int size()const{ return size_; } } int x; BLA b[ 2 ]; BLA * p = &b[
我有以下代码: #test img {vertical-align: middle;} div#test { border: 1px solid green; height: 150px; li
我想大多数使用过 C/C++ 的人都对预处理器的工作原理有一定的直觉(或多或少)。直到今天我也是这么认为的,但事实证明我的直觉是错误的。故事是这样的: 今天我尝试了一些东西,但我无法解释结果。首先考虑
我想为 TnSettings 做 mock,是的,如果通过以下方法编写代码,它就可以工作,问题是我们需要为每个案例编写 mock 代码,如果我们只 mock 一次然后执行多个案例,那么第二个将报告异常
我的项目中有以下两个结构 typedef volatile struct { unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over U
Regex rx = new Regex(@"[+-]"); string[] substrings = rx.Split(expression); expression = "-9a3dcb
我的两个应用程序遇到了一个奇怪的问题。这是设置: 两个 tomcat/java 应用程序,在同一个网络中运行,连接到相同的 MS-SQL-Server。一个应用程序,恰好按顺序位于 DMZ 中可从互联
我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 作斗争。 拿这段代码: this.webView.setOnLongClickListener(new
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我是一名优秀的程序员,十分优秀!