moveToThread()和start()适用于非构造对象?

时间:2016-10-28 14:02:37

标签: c++ multithreading qt

我有这样的事情:

  

的main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    static Communication *c = new Communication();
    return a.exec();
}
  

communication.cpp

t是Qthread对象......

Communication::Communication() 
{
    client = new EchoClient(QUrl(QStringLiteral("ws://localhost:1234")), 0);
    client->moveToThread(&t);
    connect(&t, SIGNAL(started()), client, SLOT(proces()));
    t.start(QThread::HighestPriority);
}

当我调用构造函数时,该对象怎么可能还没有被创建但是会在主循环的下一次迭代中?我试图实现这一点,首先创建对象,然后移动到线程,并在等待用户输入时顺便听取消息。

THX

修改

我只想将客户端添加到另一个线程,因为在主线程中我想等待用户输入,如果我稍微增强一点

Communication::Communication() 
{
    client = new EchoClient(QUrl(QStringLiteral("ws://localhost:1234")), 0);
    client->moveToThread(&t);
    connect(&t, SIGNAL(started()), client, SLOT(proces()));
    t.start(QThread::HighestPriority);


std::cout << "\n***************CLIENT MENU***************\n";
std::cout << "(1): SHOW
std::cout << "(2): EXIT\n";
std::cout << "***************************************************\n";

std::cin >> m_choice;

}

问题是它会显示菜单,它会被阻止而不会收到任何消息

1 个答案:

答案 0 :(得分:3)

控制台I / O阻塞:当cin >> m_choice等待主线程中的用户输入时,主线程无法执行任何其他操作。事件循环不会运行,主线程中的任何插槽都不会运行,等等。

您可能希望将基于控制台I / O的菜单系统移动到专用线程,并通过信号/插槽将其与系统的其余部分连接。