環形緩衝佇列技術應用例項

2021-08-15 03:28:19 字數 3757 閱讀 4169

png解析度1080x800

方案2】提前把所有png載入到記憶體,並且繪製成qpixmap

用vector實現環形佇列,定義乙個qpixmap型別的qvector容器,用於儲存位圖影象。

qvectorslicebuffer;
設定佇列深度,預先從磁碟載入少量位圖影象。

#define slicedatabufferlength 50
設定序號變數,記錄當前需要從磁碟載入的序號

int wsliceindextoread = 0;

預先從磁碟載入位圖,填滿緩衝區

slicebuffer.clear();

for (int i = 0; i < slicedatabufferlength; i++)

wsliceindextoread = slicedatabufferlength;

【初始化執行緒】(重點關注紅色加粗內容)

if (m_writebufferthread)

m_writebufferthread = new qthread();

m_writebufferobj->movetothread(m_writebufferthread);

connect(m_writebufferthread, &qthread::finished, m_writebufferthread, &qobject::deletelater);

connect(m_writebufferthread, &qthread::finished, m_writebufferobj, &qobject::deletelater);

connect(this, &mainwindow::startwritebuffer, m_writebufferobj, &writeslicebufferthreadobject::writebuffer);

connect(m_writebufferobj, &writeslicebufferthreadobject::message, this, &mainwindow::receivemessage);

m_writebufferthread->start();

【填充操作】

void writeslicebufferthreadobject::writebuffer()

}}

【初始化執行緒】(重點關注紅色加粗內容)

void mainwindow::startbuildthread()

m_buildthread = new qthread();

m_buildobj->movetothread(m_buildthread);

connect(m_buildthread, &qthread::finished, m_buildthread, &qobject::deletelater);

connect(m_buildthread, &qthread::finished, m_buildobj, &qobject::deletelater);connect(this, &mainwindow::startprint, m_buildobj, &printbuildthreadobject::buildrun);/*connect(m_buildobj, &printbuildthreadobject::message, this, &mainwindow::receivemessage);

connect(m_buildobj, &printbuildthreadobject::progress, this, &mainwindow::updateprogress);

connect(m_buildobj, &printbuildthreadobject::complete, this, &mainwindow::completebuild);*/

m_buildthread->start();

}

//列印執行緒設定

if (m_buildobj)

void printbuildthreadobject::buildrun()

qfile file(m_gcodefile);

if (!file.open(qfile::readonly | qfile::text))

qtextstream in(&file);

large_integer large_interger;

double dff;

__int64 c0,c1, c2, c3 = 0,c4;

queryperformancefrequency(&large_interger);

dff = large_interger.quadpart;

queryperformancecounter(&large_interger);

c0 = large_interger.quadpart;

singleton::getinstance()->m_cancontinue = true;

while (!in.atend())

qstring line;

if (singleton::getinstance()->m_cancontinue)

line = in.readline();

else

line = "idle";

if (line.startswith(";"))

else if (line.startswith(";"))

}else if (line.startswith("g1"))

delete sendbuffer;

//emit message(qstring::fromlocal8bit("%1:已傳送g1命令").arg(singleton::getcurrenttime()));

queryperformancecounter(&large_interger);

c2 = large_interger.quadpart;

if (c3 != 0)

//qdebug() << tr("time intevl:%1").arg((c2 - c3) * 1000 / dff);

emit message(tr("time intevl:%1").arg((c2 - c3) * 1000 / dff));

c3 = c2;

} }queryperformancecounter(&large_interger);

c4 = large_interger.quadpart;

int secs = (c4 - c0) * 1000 / dff / 1000;

qstring slaspetime = tr("total time:%1 min %2 sec").arg(secs / 60).arg(secs % 60);

emit message(slaspetime);

emit complete();

file.close();

}

void mainwindow::updateprogress(int value)

//m_pic->showmaximized();

}

緩衝環形佇列

在程式的兩個模組間進行通訊的時候,緩衝區成為乙個經常使用的機制。寫入模組將資訊寫入緩衝區中,讀出模組將資訊讀出緩衝區。這樣使得 緩衝區顯然不適合下面的情況 緩衝區的設計 佇列使用環形佇列,如上圖。環形佇列的特點是,不需要進行動態的記憶體釋放和分配,使用固定大小的記憶體空間反覆使用。在實際的佇列插入和...

環形緩衝區 環形緩衝佇列學習

專案中需要執行緒之間共享乙個緩衝fifo佇列,乙個執行緒往佇列中添資料,另乙個執行緒取資料 經典的生產者 消費者問題 開始考慮用stl的vector容器,但不需要隨機訪問,頻繁的刪除最前的元素引起記憶體移動,降低了效率。使用linklist做佇列的話,也需要頻繁分配和釋放結點記憶體。於是自己實現乙個...

緩衝區設計 環形佇列

目錄 在程式的兩個模組間進行通訊的時候,緩衝區成為乙個經常使用的機制。如上圖,寫入模組將資訊寫入緩衝區中,讀出模組將資訊讀出緩衝區。這樣使得 緩衝區顯然不適合下面的情況 佇列使用環形佇列,如上圖。環形佇列的特點是,不需要進行動態的記憶體釋放和分配,使用固定大小的記憶體空間反覆使用。在實際的佇列插入和...