在寫乙個c/s的客戶端時,想要把收和發分開處理,於是很自然的想到了要用到執行緒。
在用c語言寫的時候**可以除錯出來,因為是結構化程式設計,所以函式與函式之間耦合性不是很強,執行緒函式也就沒有與其他函式起衝突。但是當我想要把**改為c++實現時,出現問題了。
把函式封裝在類裡,寫成成員函式的形式,體現內聚性。我們寫的**應該盡量的高內聚、低耦合。
一旦使用類,所有函式都封裝作為類的成員函式,那麼,建立執行緒時,必然會建立新的物件。接著執行新的物件的建構函式,執行執行緒函式,遞迴,程式會崩潰。。也嘗試把執行緒函式寫為類的友元函式 (類中函式宣告前加friend),可是建立執行緒的函式 pthread_create() 的引數依然是個問題,如果傳入套接字,那麼誰來接收?如果是這個類的另乙個物件接收,勢必會執行預設的拷貝建構函式。所以還是會出現上述問題。
當然,如果形參寫的是引用的話,不會多拷貝乙份實參,這個方法我還沒有嘗試。
想到的另一種方式是,建立兩個類。乙個用於接收,另乙個用於傳送。此外,把執行緒函式的宣告放在兩個類的外面。
下面是部分**,供以參考:
//建構函式,實現初始化的操作
tellersend::tellersend()
cout << "connnect to server success!" << endl;
//開執行緒(只用於接收伺服器的應答訊息)
int ret = -1;
int newfd = this->sfd; //將此套接字作為執行緒引數傳遞
pthread_t rcvthread;
ret = pthread_create(&rcvthread, null, handlercv, (void *)newfd);
if (-1 == ret)
handlesnd(); //向伺服器傳送請求(主線程)
}
接著是執行緒函式:
//接收伺服器的應答訊息
void *handlercv(void *arg)
然後是接收類的建構函式:
//建構函式,只用於接收(根據接收的包頭資訊的不同,執行相應的成員函式)
tellerrecv::tellerrecv(int newsfd = -1)
//根據接收到的包頭中的命令,接收之後不同的包體
switch ( qhead.cmd )
break;
case 1:
break;
//...
default:
break;
} }}
最後給出標頭檔案中類的宣告:
//傳送類
class tellersend
;
void tcpconnect(const char *ip, const int port); //連線伺服器
void handlesnd();
int getcommand(); //選單項
void loginsnd(); //櫃員註冊
void landsnd(); //櫃員登陸
void quitsnd(); //客戶端退出
protected:
private:
int sfd; //連線伺服器的套接字
int cmd; //接收選單項輸入(命令)
};//接收類
class tellerrecv;
void loginrcv();
void quitrcv();
void landrcv();
protected:
private:
int sfd;
int cmd;
};extern int landflag; //登陸成功標誌
extern void *handlercv(void *arg); //執行緒函式(在此執行緒函式中建立新的物件)
extern void logininput(requestlogin &arg); //註冊資訊錄入
#endif
如果讀者有更好的方式處理執行緒和類的問題,歡迎指正。 c 執行緒建立呼叫類中函式
在編寫eventloopthread類中,需要在類中創造新執行緒並呼叫類中的函式,卻發現pthread create函式報錯,引數不匹配。例子如下 class eventloppthread void eventloopthread func void 省略實現 void eventloopthre...
C 類中定義執行緒
1.c 中如何定義執行緒函式 有兩種方法 a.定義執行緒函式為全域性函式 b.定義執行緒函式為類的靜態成員函式 2.c 中的執行緒函式如何訪問類中的成員變數 class cmyclass void cmyclass testfunc thread function adapter int cmycl...
C 類中建立執行緒
經常會遇到需要在類中建立執行緒,可以使用靜態成員函式,並且將類例項的指標傳入執行緒函式的方式來實現。實現 如下 類標頭檔案 ctestthread.h include include includeclass testthread 類原始檔 ctestthread.cpp include ctest...