首先說一下對多執行緒這個名詞的理解過程。以前聽說過很多次多執行緒這個詞,而且往往與伺服器聯絡起來,因此一直把多執行緒誤解為伺服器特有的功能;直到這次課程設計,仔細學習了一下多執行緒的機制,才知道真正的意思。簡單的來說,就是同時有多個執行緒一起執行,而不同的執行緒可以執行不同的操作。舉個例子,乙個影象處理工具,可以用滑鼠一邊移**像,一邊用快捷鍵縮放影象,此時,移**像、縮放影象就是不同的執行緒來處理的,如果不支援多執行緒而是單執行緒的,那麼只能挨個操作了。
而對於伺服器來說,多執行緒的這個特性太有用了,因為多執行緒使得伺服器可能同時響應多個客戶端的請求,所以現在伺服器大多採用多執行緒,所以才會造成我開始的誤解。
不管是多執行緒,還是伺服器,qt中已經封裝好了特定的類,所以使用起來也很方便。下面建立乙個支援多執行緒、tcp的伺服器。
首先建立乙個伺服器。新建乙個類(server)繼承qt中的qtcpserver類即可。伺服器的職責是監聽埠。當監聽到有客戶端試圖與伺服器建立連線的時候,分配socket與客戶端連線,再進行資料通訊。qtcpserver的listen()方法執行監聽過程,可以指定監聽的位址和埠。若給定了qhostaddress型別的監聽位址,則監聽該位址,否則,監聽所有位址;若給定了quint16型別的監聽埠,則監聽該埠,否則,隨機選定乙個監聽埠。
view plaincopy to clipboardprint?server * server = new server;if(!server->listen(host,port))qtcpserver有乙個虛函式incomingconnection(int socketdescriptor),伺服器每當監聽到乙個客戶端試圖建立連線的時候,會自動呼叫這個函式,因此,處理這個請求的過程就可以在這個函式中電影,即在子類server的定義階段,重新定義incomingconnection()這個函式。server * server = new server;
if(!server->listen(host,port))
對於乙個多執行緒的伺服器,每當客戶端試圖連線的時候,伺服器應該啟動乙個執行緒,負責對這個客戶端進行服務,所以,incomingconnection()這個函式所要做的就是建立乙個執行緒,而所建立的執行緒的作用就是對客戶端進行服務,而這其中建立socket連線是基礎。伺服器在監聽到客戶端試圖建立socket連線時,會為此socket分配乙個唯一的標識socketdescriptor,這個標識將在伺服器端建立socket連線時使用,所以應提供給每乙個執行緒。
在qt中使用多執行緒,建立乙個類(thread)繼承qthread類即可。qthread類也有乙個虛函式,這個函式是run(),執行緒建立並啟動(qthread::start())後,就會執行這裡面的**,因此,執行緒的邏輯過程就應該在run()裡面定義。伺服器的執行緒要根據socketdescriptor標識的socket建立連線,然後進行資料通訊,所以要將socketdescriptor傳入到thread中,前面說過,執行緒是在incomingconnection()裡面建立,用建構函式將socketdescriptor傳入thread類,再用socketdescriptor建立socket連線。
定義incomingconnection()
view plaincopy to clipboardprint?void incomingconnection(int socketdescriptor)
void incomingconnection(int socketdescriptor)定義run()
view plaincopy to clipboardprint?
void run()
void run()自此,乙個簡單的多執行緒伺服器建立完畢。
QT4中構建多執行緒的伺服器
出錯和經驗 2009 04 28 15 43 48 閱讀12 字型大小 大 中小 訂閱qt4中構建多執行緒的伺服器 首先說一下對多執行緒 這個名詞的理解過程。以前聽說過很多次多執行緒這個詞,而且往往與 伺服器聯絡起來,因此一直把多執行緒誤解為伺服器特有的功能 直到這次 課程設計 仔細 學習 了一下多...
QT4中構建多執行緒的伺服器
而對於伺服器來說,多執行緒的這個特性太有用了,因為多執行緒使得伺服器可能同時響應多個客戶端的請求,所以現在伺服器大多採用多執行緒,所以才會造成我開始的誤解。不管是多執行緒,還是伺服器,qt中已經封裝好了特定的類,所以使用起來也很方便。下面建立乙個支援多執行緒 tcp的伺服器。首先建立乙個伺服器。新建...
構建多執行緒的伺服器
簡單的來說,就是同時有多個執行緒一起執行,而不同的執行緒可以執行不同的操作。舉個例子,乙個影象處理工具,可以用滑鼠一邊移 像,一邊用快捷鍵縮放影象,此時,移 像 縮放影象就是不同的執行緒來處理的,如果不支援多執行緒而是單執行緒的,那麼只能挨個操作了。而對於伺服器來說,多執行緒的這個特性太有用了,因為...