修复 性能测试竞态bug

This commit is contained in:
2026-07-23 13:54:06 +08:00
parent 6ece8054ac
commit 94bb3d4f89
3 changed files with 173 additions and 139 deletions
+53 -92
View File
@@ -1,106 +1,67 @@
#include "PerformanceShower_p.h"
#include <QPainter>
#include <QVBoxLayout>
namespace YSG {
PerformanceShower::PerformanceShower(QWidget *parent) : QWidget(parent) {
setAttribute(Qt::WA_OpaquePaintEvent, true);
auto layout = new QVBoxLayout(this);
layout->setSpacing(0);
PerformanceShower::PerformanceShower() {
dPtr = new PerformanceShowerPrivate;
mObjectName = "PerformanceShower";
}
PerformanceShowerPrivate* PerformanceShower::d() {
return reinterpret_cast<PerformanceShowerPrivate*>(dPtr);
}
RenderData* PerformanceShower::createRenderData() {
return new PerformanceShowerPrivate;
}
RenderState* PerformanceShower::createRenderState() {
return new PerformanceShowerRenderState;
}
InputData* PerformanceShower::createInputData() {
return new PerformanceShowerInputData;
}
void PerformanceShower::setEnabled(bool enabled) {
mEnabled.store(enabled, std::memory_order_release);
if(enabled) {
appendEvent({PerformanceEventType::Clear});
}
markRenderDirty();
}
bool PerformanceShower::enabled() const {
return mEnabled.load(std::memory_order_acquire);
}
void PerformanceShower::refreshCounter() {
std::lock_guard<std::mutex> lock(mMutex);
for(CounterLine& value : mCounter) {
value.mStatistics.clear();
}
appendEvent({PerformanceEventType::Clear});
}
void PerformanceShower::counterIncrease(const QString& counterName) {
std::lock_guard<std::mutex> lock(mMutex);
if(!mCounter.contains(counterName)) {
mCounter[counterName].mName = counterName;
}
mCounter[counterName].mStatistics.update(1);
PerformanceEvent event;
event.type = PerformanceEventType::Counter;
event.key = counterName;
appendEvent(event);
}
void PerformanceShower::setPerformanceLine(const QString& key, const PerformanceLine& line) {
std::lock_guard<std::mutex> lock(mMutex);
mInfoMap[key] = line;
PerformanceEvent event;
event.type = PerformanceEventType::Line;
event.key = key;
event.line = line;
appendEvent(event);
}
void PerformanceShower::setInfo(const QString& key, const QString& value) {
std::lock_guard<std::mutex> lock(mMutex);
mInfos[key] = value;
PerformanceEvent event;
event.type = PerformanceEventType::Info;
event.key = key;
event.value = value;
appendEvent(event);
}
void PerformanceShower::paintEvent(QPaintEvent *event) {
QPainter painter(this);
QPoint topLeft = rect().topLeft();
int x = topLeft.x() + mLeftMargin;
int y = topLeft.y() + mTopMargin;
painter.fillRect(rect(), Qt::white);
painter.setFont(mFont);
{
std::lock_guard<std::mutex> lock(mMutex);
QFontMetrics fm(mFont);
int n = mAllInfo.size();
for(int i = 0; i < n; i++) {
painter.drawText(topLeft + QPointF(x, y + i * fm.lineSpacing() + fm.lineSpacing()), mAllInfo[i]);
}
}
painter.end();
void PerformanceShower::recordCost(const QString& key, double value) {
PerformanceEvent event;
event.type = PerformanceEventType::Cost;
event.key = key;
event.number = value;
appendEvent(event);
}
void PerformanceShower::mousePressEvent(QMouseEvent *event) {
if(mMoving) return;
if(event->button() == Qt::LeftButton) {
mMoving = true;
mStartPos = pos();
mStartGlobalPos = event->globalPos();
}
event->accept();
}
void PerformanceShower::mouseMoveEvent(QMouseEvent *event) {
if(!mMoving) return;
move(mStartPos + event->globalPos() - mStartGlobalPos);
event->accept();
}
void PerformanceShower::mouseReleaseEvent(QMouseEvent *event) {
if(!mMoving) return;
mMoving = false;
event->accept();
}
QVector<QString> PerformanceShower::all() {
std::lock_guard<std::mutex> lock(mMutex);
QVector<QString> infoList = mFixedInfo;
for(PerformanceLine& l : mInfoMap) infoList.append(l.toString());
for(CounterLine& c : mCounter) infoList.append(c.toString());
for(auto it = mInfos.cbegin(); it != mInfos.cend(); ++it) {
infoList.append(QString("%1: %2").arg(it.key(), it.value()));
}
return infoList;
}
void PerformanceShower::refresh() {
QVector<QString> infoList = all();
{
std::lock_guard<std::mutex> lock(mMutex);
mAllInfo = infoList;
int n = mAllInfo.size();
if(mOldSize != n) {
int maxWidth = 0;
QFontMetrics fm(mFont);
for(int i = 0; i < n; i++) maxWidth = qMax(maxWidth, fm.horizontalAdvance(mAllInfo[i]));
int w = maxWidth + mLeftMargin + mRightMargin;
int h = fm.lineSpacing() * n + mTopMargin + mBottomMargin;
QMetaObject::invokeMethod(this, "firstResize", Q_ARG(int, w), Q_ARG(int, h));
}
mOldSize = n;
}
QMetaObject::invokeMethod(this, "update");
}
void PerformanceShower::firstResize(int w, int h) {
resize(w, h);
}
void PerformanceShower::resizeEvent(QResizeEvent *event) {
event->accept();
void PerformanceShower::appendEvent(const PerformanceEvent& event) {
if(!enabled() && event.type != PerformanceEventType::Clear) return;
auto pd = d();
Triple_Buffer_Lease inputLease = pd->mInputControl.wait_mark_use_role(Input_Edit);
auto input = reinterpret_cast<PerformanceShowerInputData*>(pd->inputDataByIndex(inputLease.index));
input->events.append(event);
RenderInputGuard inputGuard(pd, inputLease);
}
}