QT多線程查詢數(shù)據(jù)庫(kù)顯示到tablewidget里面
1、線程內(nèi)注冊(cè)與連接數(shù)據(jù)庫(kù)的競(jìng)爭(zhēng)問(wèn)題
文檔上對(duì)多線程下數(shù)據(jù)庫(kù)應(yīng)用的注意事項(xiàng)寫的很簡(jiǎn)明,一個(gè)線程創(chuàng)建的 QSqlDatabase 對(duì)象和 查出來(lái)的 QSqlQuery 對(duì)象只能給本線程用(注意,是對(duì)象,不是數(shù)據(jù)庫(kù)連接本身,連接本身用名字可以多線程使用),其他情況是“不支持的”。在一個(gè)需要有幾個(gè)線程并發(fā)訪問(wèn)不同數(shù)據(jù)庫(kù)的應(yīng)用中,我首先試圖在各個(gè)線程的起始分別以不同的名稱調(diào)用 addDatabase / database 、open,但是程序偶然會(huì)崩潰,跟蹤后發(fā)現(xiàn),雖然Qt 聲稱很多方法是“線程安全”的,但是幾個(gè)方法串起來(lái),就出問(wèn)題了。Qt 會(huì)動(dòng)態(tài)的加載數(shù)據(jù)庫(kù)的plugin, 加載 plug in 的部分,涉及到對(duì)本地庫(kù)文件的管理,這一部分,出現(xiàn)了競(jìng)爭(zhēng)。于是,很自然的想到在初始連接部分設(shè)置 Mutex 保護(hù),從 addDatabase / database到 open 的部分,要保證其原子性,問(wèn)題再也沒有出現(xiàn)。
2、數(shù)據(jù)庫(kù)連接意外斷裂后,恢復(fù)連接的問(wèn)題
在MFC 中,一旦中途TCP連接斷裂,直接重新 Open 就可以了。在Qt 里,這一招不好使了。即便 調(diào)用了 close ,再次open 也是不行的。處理方法:
在檢測(cè)到問(wèn)題出現(xiàn)后,關(guān)閉連接,并 removeDatabase; 而后,不要立刻 addDatabase, 反而是要回到該連接所在的事件循環(huán)。沒有詳細(xì)跟源碼,很可能在 removeDatabase 后的事件循環(huán)中,Qt 內(nèi)部做了一些釋放操作。 怎么辦呢, 可以設(shè)置一個(gè)恢復(fù)定時(shí)器,比如 1分鐘,重新 addDatabase,就可以啦。如果心急的話,直接顯式調(diào)用processEvent() 方法強(qiáng)制循環(huán)。
在多線程下,注意1中的問(wèn)題,需要 Mutex保護(hù)。
3、數(shù)據(jù)庫(kù)插件的依賴性問(wèn)題
在 Windows 下,有時(shí)我們的機(jī)器上按了好幾個(gè) Qt 版本,PATH里索性神馬也不設(shè)置,依賴開發(fā)環(huán)境的繼承環(huán)境適應(yīng)不同的版本。這有兩個(gè)問(wèn)題。一是發(fā)布程序的時(shí)候,數(shù)據(jù)庫(kù)驅(qū)動(dòng)依賴的dll 也要與可執(zhí)行文件在同一路徑下發(fā)布。比如 mysql 的 dll, PostgreSQL 的依賴等。二是在集成開發(fā)環(huán)境中,這些依賴也要位于執(zhí)行檔文件夾下。否則,會(huì)造成雖然可以枚舉到可用驅(qū)動(dòng),但是死活連接不上。調(diào)試一下就知道,原來(lái)是在路徑中找不到依賴項(xiàng),導(dǎo)致dll加載失敗哦!
各位QT大俠: QT多線程編程的時(shí)候,怎么把次線程處理好的數(shù)據(jù)實(shí)時(shí)的顯示到ui上去?
我的主線程就一個(gè)MainWindow,里面由一個(gè)TableWidget,怎么把我的次線程里面的數(shù)據(jù)實(shí)時(shí)顯示到這個(gè)TableWidget上?次線程主要完成從另外一個(gè)計(jì)算機(jī)接收UDP數(shù)據(jù),并完成解析。Qt上要求界面處理一般需要在主線程中完成。
所以最好把次線程中的數(shù)據(jù)緩沖區(qū)放到主線程中:
1、一種方式可以進(jìn)行數(shù)據(jù)拷貝,但肯定效率低了。
2、另一種方式是直接將數(shù)據(jù)緩沖區(qū)放到主線程中,然后在主線程中處理讀取數(shù)據(jù)槽。但這樣可能主線程壓力大,機(jī)器配置不能太低。
3、直接在主線程中訪問(wèn)次線程的數(shù)據(jù)并刷新界面,不過(guò)這處理起來(lái)復(fù)雜(需要手工同步),容易出錯(cuò)。
4、將TableWidget指針傳入次線程中,直接在次線程中對(duì)其進(jìn)行操作并發(fā)送刷新信號(hào)。這種方式未經(jīng)驗(yàn)證,感覺可能性不大:一方面指針容易走空,另一方面就是前面說(shuō)的限制在主線程中對(duì)接面進(jìn)行處理。不過(guò)所說(shuō)的“處理”可能并不包括刷新數(shù)據(jù)吧。
期待樓主進(jìn)行驗(yàn)證,并展示結(jié)果。(或者樓主可以將UDP試驗(yàn)項(xiàng)目發(fā)送給我,讓我試試,QQ:956693152,謝謝!)
QT中怎么在tableview中顯示表格數(shù)據(jù)
誰(shuí)知道為什么我運(yùn)行程序在tableview中空白一片,我數(shù)據(jù)庫(kù)表格有數(shù)據(jù)的
看看Qt文檔中的QSqlTableModel類 有列子的,可以直接顯示到Tableview
怎么用Qt的TableView來(lái)顯示數(shù)據(jù),數(shù)據(jù)有些來(lái)自MySQL的表中(多張不同的表),并且有些數(shù)據(jù)并不是從MySQL取
怎么用Qt的TableView來(lái)顯示數(shù)據(jù),數(shù)據(jù)有些來(lái)自MySQL的表中(多張不同的表),并且有些數(shù)據(jù)并不是從MySQL取
可以采用Stacked Layouts分頁(yè)布局,具體實(shí)現(xiàn)代碼如下,望采納:
//創(chuàng)建QWidget類的一個(gè)對(duì)象pWidget
QWidget *pWidget = new QWidget;
//創(chuàng)建一個(gè)布局管理器類 layout
QHBoxLayout *manLayout = new QHBoxLayout;
//左邊的列表控件
QListWidget *listWidget = new QListWidget(pWidget);
listWidget->addItem(QObject::tr("外觀設(shè)置"));
listWidget->addItem(QObject::tr("網(wǎng)頁(yè)瀏覽"));
...
qt怎樣創(chuàng)建數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的操作
qt可以實(shí)現(xiàn)連接各種數(shù)據(jù)庫(kù),這里介紹qt自帶的一種數(shù)據(jù)庫(kù)(Qsqlite)
#include<QSqlQuery>
#include<QObject>
#include<QVariantList>
#include<QDebug>
#include<QSqlError>
#include<QTextCodec>
#include<QObject>
staticboolcreateConnection()
{QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mytest.db");
if(!db.open())
returnfalse;
QSqlQueryquery;
//query.exec(QObject::tr("createtablestudent(idintprimarykey,namevchar)"));
//query.exec(QObject::tr("insertintostudentvalues(0,'劉')"));
////query.exec(QObject::tr("insertintostudentvalues(1,'剛')"));
//query.exec(QObject::tr("insertintostudentvalues(2,'紅')"));
//query.prepare("insertintostudentvalues(?,?)");
//-------------------------------------------------------
//通過(guò)下面這段代碼可以實(shí)現(xiàn)向數(shù)據(jù)庫(kù)插入變量
//--------------------------------------------------------
QVariantListages;
intx1,x2,x3,x4;
x1=12;
x2=13;
x3=14;
x4=15;
ages<<x1<<x2<<x3<<x4;
query.addBindValue(ages);
QVariantListnames;
names<<QObject::tr("小王")<<QObject::tr("小明")<<QObject::tr("小張")<<QObject::tr("小新");//如果要提交空串,用QVariant(QVariant::String)代替名字
query.addBindValue(names);
if(!query.execBatch())//進(jìn)行批處理,如果出錯(cuò)就輸出錯(cuò)誤
qDebug()<<query.lastError();
returntrue;
}
#endif//DATABASE_H
然后用QSqlTableModel實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)顯示
相關(guān)推薦:
離婚人的個(gè)稅(離異家庭個(gè)稅子女扣除)
產(chǎn)品雙倍賠償(消費(fèi)者在何種情況下可獲得雙倍賠償)
不予登記立案(民事不予立案六種情形)
違規(guī)披露賠償(違規(guī)披露被立案能索賠嗎)
詐騙投資立案(投資詐騙的立案標(biāo)準(zhǔn))