关于std::cin阻塞事件循环以及控制台命令输入功能的方案;

如果将std::cin建立在主线程,将阻塞主线程的所有事件循环,因而要保证事件循环不受影响,需要将std::cin放到

子线程中。同时,如果要实现能够强制终止std::cin阻塞, 可以通过强制终止线程的方式来实现。

class  Loop:public QThread
{
    Q_OBJECT
public:
    explicit  Loop(QObject *parent = nullptr){}
    void run(){       
        std::cout<<"\nOTAI>>";
        char str[200] = {0};
        std::cin.getline(str,200);
        emit  command(QString(str));
    }
signals:
    void      command(QString  szCmd);
private slots:
};

开启输入: 

 if(!m_pLoop)      // Loop * m_pLoop;
    {
        m_pLoop = new EventLoop;
        QObject::connect(m_pLoop,SIGNAL(command(QString)), this,SLOT(excuteCmd(QString)));
        m_pLoop->start();
    }

强制关闭线程:

    if(m_pLoop)
    {
        m_pLoop->terminate();
        m_pLoop->wait(200);
        m_pLoop = nullptr;
    }

  

 

posted @ 2019-04-26 15:16  时光旅者  阅读(1423)  评论(0编辑  收藏  举报