Uygulama hakkında soru.exec() ve Qt'de döngü

0

Soru

Değil app.exec() geri dönen sonsuz bir döngü main() ?

Aşağıdaki sunucu istemci iletişimini döngü yapmak istiyorum, ancak yalnızca bir tane çalıştırılıyor ve ardından ana işlev şu şekilde bitiyor: app.exec()

Hem Qt hem de C++ için yeniyim, bu döngüyü nasıl yönetebilirim?

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();
}

---------GÜNCELLEŞTİRME---------

Bu iş parçacığını iş parçacığında oluşturdum.h

class MyThread : public QThread{
public slots:
    void run();
};

iplik halinde.cpp yöntemi bildirdim:

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**********//
}

ana bölümde.cpp dedim.:

QThread *thread = new QThread();

MyThread *myThread = new MyThread();
myThread->moveToThread(thread);
myThread->connect(thread, SIGNAL(started()), myThread, SLOT(run()));

thread->start();

Alırım Error: Class declaration lacks Q_OBJECT macro. QThread, Qobject'i devralmaz mı? Döngüyü nasıl düzgün çağırabilirim?

c++ qt
2021-11-23 09:48:10
1

En iyi cevabı

0

Şu anda üzerinde çalıştığım ana projelerden biri Qt ve ZMQ kullanıyor - ZMQ soketlerinizin içinde yaşaması gerekiyor. QObject bu, uygulamanın olay döngüsünde çalışır, içinde değil main() uygulamanızın işlevi

İşte ZMQ soketlerimizden birinin Qt olay döngüsünde nasıl iletişim kurduğuna dair çok kısaltılmış bir görünüm-uygulamanın ZMQ_SUB bir sokete bağlı ZMQ_PUB diğer ucundaki yuva olayları bir donanım arabiriminden yayımlama

int main(int argc, char* argv[])
{
   QApplication app(argc, argv);
   ...
   ConnectionManager connMgr; // Create connection class - is a QObject subclass
   connMgr.connect(target);

   MainWindow mainWin; // Create GUI classes

   return app.exec();
}
void ConnectionManager::connect(std::string target)
{
    context = zmq_ctx_new();

    zsocket = zmq_socket(context, ZMQ_SUB);
    zmq_connect(zsocket, (connection + ":" + REQUEST_PORT).c_str());
    ...

    QTimer pollTimer;
    pollTimer.callOnTimeout(this, &ConnectionManager::onPollTimer);
    pollTimer.start(100);
}

void ConnectionManager::onPollTimer()
{
    uint16_t length = 0;

    const size_t buffer_length = 1024;
    uint8_t* buffer = new uint8_t[buffer_length];

    do
    {
        int64_t more = 0;
        size_t more_size = sizeof more;
        auto len = zmq_recv(zsocket, buffer + length, buffer_length - length, ZMQ_NOBLOCK);
        if (len == -1)
        {
            return;
        }
        else if (len > 0)
        {
            length += len;
            auto rc = zmq_getsockopt(socket, ZMQ_RCVMORE, &more, &more_size);
        }
    } while (more);

    std::cout << "Received" << length << "bytes";
    HandleMessage(buffer, length); // Process the incoming message
}

Özünde, app.exec() Sonsuz bir döngü oluşturur, ancak bu döngü içinde bulunur QApplication nesne, sadece art arda çalışan bir nesne değil main() çağrıldığı işlev ve bu döngüden yararlanmak için uygulamanız ek örnekler oluşturmalıdır QObject alt sınıflar ve kullanıcı eylemlerine/giriş olaylarına/zaman aralıklarına yanıt olarak eylemler gerçekleştirmek için sinyal/yuva/QEvent/QTimer mekanizmalarını kullanma

2021-11-23 18:47:50

Açıklama için teşekkür ederim, ama bunu uygulamak benim için gerçekten zor. Yukarıda yazdığım kodları kullanarak bu durumdan geçmek mümkün mü?
noobie

Sorunuzda "Hem Qt hem de C++ için yeniyim" dediniz - genel olarak programlamaya yeni misiniz yoksa başka dillerde mi yazdınız ve şimdi ilk kez C++/Qt'de bir şeyler deniyorsunuz? Burada yapmaya çalıştığın şey genel olarak bu Qt uygulamaları yazmak için temel mekanizma vardır genel olarak dili ile tanıdık daha aldı ve sonra Qt uygulama olay döngü ve sinyal/slot mekanizmalar nasıl kendini tanımaya, kadar uygulamak için acemi bir programcı olarak çalışıyorum tavsiye ederim bir şey olmadığı için soruyorum
rdowell

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................