stdについて::cinブロックイベントループおよびコンソールコマンド入力機能のスキーム;

1111 ワード

std::cinをプライマリ・スレッドに確立すると、プライマリ・スレッドのすべてのイベント・ループがブロックされます.したがって、イベント・ループが影響を受けないことを保証するには、std::cinを配置する必要があります.
サブスレッド内.また、std::cinブロックを強制的に終了させることができるようにするには、スレッドを強制的に終了させることによって実現することができる.
すなわち
class  Loop:public QThread
{
    Q_OBJECT
public:
    explicit  Loop(QObject *parent = nullptr){}
    void run(){       
        std::cout<>";
        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;
    }