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