- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一种绘图算法。为此,我从主GUI线程中的DAQ板上获取数据,然后将数据发送到工作线程进行处理,该工作线程发出带有新QImage
的信号,该信号在图形用户界面中显示为图。问题在于函数,我们将其称为generateImage()
,以计算和生成QImage
会花费很长时间(约50-70毫秒,具体取决于数据长度),并且在此期间可能会到达另一组数据,这将需要工作线程从头开始重新计算情节。我希望generateImage()
放弃计算,如果新数据仍在计算时到达,则从头开始重新计算。我的方法是设置一个成员 bool 变量,我们将其称为b_abort_
,并在generateImage()
和return
内部检查是否将其设置为true,在generateImage()
外部始终将其设置为true,而我仅在调用generateImage()
之前将其设置为false。
所有这些都在工作线程中发生,我将QObject
子类化,并使用moveToThread()
将其移至工作线程中。
开始计算的函数:
void WorkerThread::startCalc()
{
b_abort_ = false;
generateImage();
// if b_abort_ is set to true, generateImage() will return prematurely
if(b_abort_)
emit calcFinished();
else
b_abort_ = true;
}
进行所有计算并生成图像的函数:
void WorkerThread::generateImage()
{
/* Calculation of some parts */
for(int ii = 0; ii < Rawdata.length(); ++ii) // Starting main time consuming loop
{
if(b_abort_)
return;
/* Perform calculation for one data point from Rawdata */
}
// data calculation complete, now it's time to generate QImage
// before that I check if b_abort_ is set to true
if(b_abort_)
return;
for(int ii = 0; ii < CalculatedData.length(); ++ii) // plotting calculated data on QImage
{
if(b_abort_)
return;
/* plot one data point from CalculatedData vector */
}
// generation of QImage finished, time to send the signal
emit renderedPlot(image); // image is a QImage object
}
在我的工作线程中,我有一个插槽可从主GUI线程接收数据,它使用
Qt::QueuedConnection
(默认)作为连接类型进行配置:
void WorkerThread::receiveData(QVector<double> data)
{
if(!b_abort_) // check if calculation is still running
{
QEventLoop loop;
connect(this, &WorkerThread::calcFinished, &loop, &QEventLoop::quit);
b_abort_ = true; // set it to true and wait for calculation to stop
loop.exec();
// start new calculation
RawData = data;
startClac();
}
else
{
RawData = data;
startClac();
}
}
当我在主GUI线程中使用此方法时,
generateImage()
函数将阻止所有事件循环,并且GUI冻结,这使我认为在单个线程(主GUI线程或辅助线程)中,一次只能运行一个函数因此
b_abort_
中的任何更改都不会应用,直到线程的事件循环返回以处理其他函数为止。使用
WorkerThread
时,很难验证它是否有效,有时它可以正常工作,而有时它会生成
分配错误错误,这似乎不起作用(尽管可能是由于完全不同的原因,但我并非如此)当然)。我想问一下您的意见,这是过早停止长时间运行的计算的正确方法吗?有没有其他方法可以比当前方法更强大?
最佳答案
How to stop a long-running function in another thread prematurely?
volatile
)。
... which makes me think that inside a single thread (main GUI thread or a worker thread) only one function can run at a time ...
关于c++ - 如何过早停止长时间运行的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64695714/
我的测试代码: int SIZE = 1900; int[][] array = new int[SIZE][]; for (int i = 0; i < SIZE; i++) { array[i
我有一堆 WAV 文件和一个将它们复制到另一个目录的脚本,但使用 SoX 处理了一些文件。输出的文件都应该有 1 个 channel ,采样率不超过 44.1khz。我的大多数文件要么有一个以上的 c
我正在运行一个相当占用内存的 Python 脚本,但似乎我的机器正在提前终止进程。我安装了 16GB(并通过 lshw -class memory 确认),但我的进程似乎在使用量达到 4GB 左右时被
我很难确定在使用 .NET 的 HttpWebRequest 类调用远程服务器(特别是 REST Web 服务)时是否有办法处理潜在的连接问题。根据我的调查,WebClient 类的行为是相同的,这在
所以我有这个网址: http://test.com/afolder/who-else-wants-to-make-horror-movies%3f/ 这是 URL 编码版本: http://test.
我是一名优秀的程序员,十分优秀!