使用线程进行控制台应用?

时间:2016-10-19 11:12:19

标签: c++ multithreading qt

我不知道是否应该在控制台应用程序中使用线程。 当我为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();我怎么能这样做?

1 个答案:

答案 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(); 
/*******************************************************/