修复 性能测试竞态bug
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user