【发布时间】:2022-01-01 19:28:54
【问题描述】:
app.exec() 不是返回main() 的无限循环吗?
我想循环下面的服务器客户端通信,但它只执行一个,然后主函数以app.exec()结束
我是 Qt 和 C++ 的新手,我该如何管理这个循环?
int main(int argc, char *argv[])
{
cout << "Waiting for the next request " << endl;
QApplication app(argc, argv);
// Prepare our context and socket
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:2424");
zmq::message_t request;
QQmlApplicationEngine engine;
VideoStreamer videoStreamer;
imageProvider *liveOriginalImageProvider(new imageProvider);
imageProvider *liveMaskedImageProvider(new imageProvider);
//********SERVER CLIENT COMMUNICATION BEGINS******//
// Wait for next request from client
cout << "Waiting for the next request ." << endl;
socket.recv(&request);
cout << "Waiting for the next request.. " << endl;
string replyMessage = string(static_cast<char *>(request.data()), request.size());
// Print out received message
cout << "Received from client (Python): " + replyMessage << endl;
// See the gradual sending/replying from client
sleep(1);
// Send reply back to client
string msgToClient("W");
zmq::message_t reply(msgToClient.size());
memcpy((void *) reply.data(), (msgToClient.c_str()), msgToClient.size());
socket.send(reply);
//*********SERVER CLIENT COMMUNICATION ENDS**********//
engine.rootContext()->setContextProperty("VideoStreamer",&videoStreamer);
engine.rootContext()->setContextProperty("liveOriginalImageProvider",liveOriginalImageProvider);
engine.rootContext()->setContextProperty("liveMaskedImageProvider",liveMaskedImageProvider);
engine.addImageProvider("liveOriginal",liveOriginalImageProvider);
engine.addImageProvider("liveMasked",liveMaskedImageProvider);
const QUrl url(QStringLiteral("qrc:/main.qml"));
engine.load(url);
QObject::connect(&videoStreamer,&VideoStreamer::originalImage,liveOriginalImageProvider,&imageProvider::updateImage);
QObject::connect(&videoStreamer,&VideoStreamer::maskedImage,liveMaskedImageProvider,&imageProvider::updateImage);
return app.exec();
}
---------更新---------
我在 thread.h
中创建了这个线程class MyThread : public QThread{
public slots:
void run();
};
在thread.cpp中我声明了方法:
void MyThread :: run() {
// Prepare our context and socket
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:2424");
zmq::message_t request;
//********SERVER CLIENT COMMUNICATION BEGINS******//
// Wait for next request from client
cout << "Waiting for the next request ." << endl;
socket.recv(&request);
cout << "Waiting for the next request.. " << endl;
string replyMessage = string(static_cast<char *>(request.data()), request.size());
// Print out received message
cout << "Received from client (Python): " + replyMessage << endl;
// See the gradual sending/replying from client
sleep(1);
// Send reply back to client
string msgToClient("W");
zmq::message_t reply(msgToClient.size());
memcpy((void *) reply.data(), (msgToClient.c_str()), msgToClient.size());
socket.send(reply);
exec();
//*********SERVER CLIENT COMMUNICATION ENDS**********//
}
在 main.cpp 我称之为:
QThread *thread = new QThread();
MyThread *myThread = new MyThread();
myThread->moveToThread(thread);
myThread->connect(thread, SIGNAL(started()), myThread, SLOT(run()));
thread->start();
我得到Error: Class declaration lacks Q_OBJECT macro.
QThread 不继承 QObject 吗?如何正确调用循环?
【问题讨论】:
-
您可以在单独的线程上运行 zeroMQ 的东西(在 QThread 上阅读),或者您可以尝试将 zeroMQ 套接字连接到事件循环。后者需要创建一个新的 QTcpSocket,采用带有
setSocketDescriptor的 zeroMQ 套接字,然后将侦听器添加到onReadyRead以实际读取(并可能处理)zeroMQ 消息。快速谷歌发现 github.com/jonnydee/nzmqt ,这是“0MQ 和 Qt 之间的无缝接口”。我强烈建议您先尝试一下。 -
不,这不是一个无限循环(如果是,它永远不会返回),它不会返回
main()- 调用main是未定义的。 -
app.exec()不是一个“返回main()的无限循环 - 它是在QApplication内部启动Qt 事件循环的原因。您的ZMQ 对象需要存在于由管理的QObjects 中的某处应用程序并在事件循环中执行它们的 I/O。 -
我不明白“将 zeroMQ 套接字连接到事件循环”是什么意思。这个事件循环在哪里,我将如何在其中编写我的 zmq 代码。.跨度>