開始的技術路線是:linux
首先有兩個主線程:api
1,gui線程數組
2,等待客戶端socket鏈接用的,listen線程服務器
(當有客戶端鏈接時,即creat一個新的線程2用來跟客戶端通訊,再來新的客戶端,繼續creat新的work線程3用於通訊,以此類推,目前最多能夠creat5個線程,便可以同時跟5臺客戶端通訊,設置了監聽的socket服務器最多監聽5個隊列。線程2繼續listen)多線程
出現的問題是:socket
用來通訊的work線程3,收到一個來自客戶端的xml文件,而後解析文件,並將其數據放在一個全局的靜態struct數組裏。數據正常,線程2和線程3都可以看到已經更新的數據值。可是,函數
當gui線程去訪問時,發現數據並無更新到其線程,在gui線程下改變該全局變量的數值,也並無更新到線程2和3,不知何解?ui
一博主,有如此解釋:spa
(此處出現過,小插曲:QT的變量查看器,在調試時不太穩定,更新事後的值在窗口中查看,並無獲得及時更新,須要經過程序斷定驗證!).net
另外的問題是:一個變量在多線程環境下,它們的地址都是不一樣的,爲何呢?待解!
因爲程序須要在線程建立以後必須返回到gui主線程,因此採用建立兩次線程的方式:建立線程A,返回,而後在線程A裏面建立
在多線程POSIX標準下,主線程(1),便是GUI線程。它初始化一個類,並調用其一個成員函數建立一個線程3(ininlistenThred)【不知,爲何不從2開始?】,而後在線程3裏面一直循環檢測是否有新的客戶端發來socket鏈接。當有新的客戶端鏈接上時,即建立一個新的線程專門用於socket通訊。
此時有一客戶端鏈接上,建立了通訊工做線程4(listenthreadwork)。
輸出g_buf[0].carid的代碼位置分別爲:
1,initlistenthread線程在進入循環入口 即打印出:
for( ; ; )
{
qDebug("listenthread g_buf[0].carid: %s ",g_buf[0].carid);
char *t = &(g_buf[0].carid[0]);
qDebug("dizhi: %d \n\n",&t);
//......
}
2,gui主線程在點擊按鈕的時候,即打印:
qDebug("mainwindow g_buf[0].carid: %s",g_buf[0].carid); char *t = &(g_buf[0].carid[0]); qDebug("dizhi: %d \n\n",&t);
3,listenthreadwork線程在循環工做的時候開始就打印信息:(一進去此線程就會先打印一次值,而後每次收到文件就會打印一次)
for( ; ; ) { qDebug("listenthreadwork g_buf[0].carid: %s",g_buf[0].carid); char *t = &(g_buf[0].carid[0]); qDebug("dizhi: %d \n\n",&t); //......... }