我正在開發一個使用執行緒連接到服務器的專案。每當按下登錄按鈕時,它都會初始化一個執行緒以使用用戶提供的給定 IP 和埠登錄。
服務器頁面.h
class ServerPage {
public:
static std::thread serverThread;
static void login();
}
服務器頁面.cpp
#include "ServerPage.h"
std::thread ServerPage::serverThread;
void ServerPage::login() {
while (/*server is not connected*/) {
if (/*button is clicked and thread is not running*/)
serverThread = std::thread(Client::init, ip, port);
}
}
在多次單擊該按鈕之前,此方法效果很好。我可以使用Client該類查看服務器的狀態(已連接、未連接或失敗) 有沒有辦法洗掉或重新初始化,以便在連接客戶端之前可以運行它?
uj5u.com熱心網友回復:
首先:執行緒無法重啟。編程中沒有這樣的概念。除非“重新啟動”是指“殺死并再次生成”。
不可能以跨平臺的方式殺死執行緒。對于 posix(我不了解其他作業系統),您可以使用 pthreads(而不是 std::thread)并向其發送終止信號并再次生成它。但這是忍者的方式,不一定是你應該做的。但是,如果您無法修改Client::init方法,那么在不削弱您的要求的情況下可能沒有其他選擇。
更好的解決方案是傳遞“取消令牌”:您可以在其上注冊取消處理程式的小物件。然后,您Client::init可以在觸發取消時自行取消。您在點擊時觸發。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495528.html
