我不知道是否应该在控制台应用程序中使用线程。 当我为START CLIENT选择选项1时,它会启动客户端并从服务器接收消息...
这是来自switch case 1的方法connectClient:
}
问题是,即使连接了SIGNAL SLOT,当从服务器发送消息时,它也不会在开始时只转到listenToMessage()一次。 所以我在想它是否只发生一次,它可能无法从服务器获取信号,因为它没有自己的线程?当我在GUi应用程序中这样做时,它工作,每次有来自服务器的消息,它显示到textEdit。
这是我的申请:
我有控制台应用程序的菜单:
consoleApp.cpp
void App::connectClient(){
if (this->client == NULL){
this->client = new Client(QUrl(QStringLiteral("ws://localhost:10000")), 0);
connect(this->client, SIGNAL(messageHasCome()), this, SLOT(listenToMessage()));
qWarning() << "CLIENT IS CONNECTING TO PORT: 10000";
}
else {
qWarning() << "CAREFULL, CLIENT IS ALREADY CONNECTED AT PORT: 10000";
emit signalShowMenu();
}
我的开关决定该怎么做:
m_out << "\n************MENU*****************\n";
m_out << "(1): START CLIENT\n";
m_out << "(2): SHOW MESSAGE FROM CLIENT\n";
m_out << "(3): SEND MESSAGE\n";
m_out << "(4): EXIT\n";
m_out << "************************************\n";
m_out.flush();
m_in >> m_choice;
所以我想做的是:每当来自服务器的消息可用时(信号messageHasCome()),即使我在菜单中也会发出信号listenToMessage()...我应该使用线程吗?我很困惑,你能解释一下这是怎么回事吗?
谢谢
EDIT1
现在我正在尝试跟随,我将其添加到我的菜单中的课程:
switch (m_choice)
{
case 1:
m_App->connectClient();
break;
case 2:
m_out << m_App->getMessageFromServer();
m_out.flush();
showMenu();
break;
case 3:
sendMessagetoServerOptionChoosen();
showMenu();
break;
case 4:
exit(EXIT_FAILURE);
break;
default:
// showMenu();
break;
}
进入菜单我添加了这个:
class App_console : public QObject {
Q_OBJECT
QThread appThread;
我缺少什么......?我想添加到不同的线程对象m_App或只是方法m_App-&gt; connectClient();我怎么能这样做?
答案 0 :(得分:0)
我解决了我的问题:
<强> consoleApp.cpp 强>
对于构造函数我添加了这个,所以我将对象m_App移动到线程appThread,然后我连接信号和插槽,它工作... signal来自consoleApp和来自m_App的插槽,这意味着当我从consoleApp调用signal时,它将从m_App对象启动进程
/****************************THREAD STUFF*****************/
m_App->moveToThread(&appThread);
connect(who,signal,who, slot);
appThred.start();
/*******************************************************/