Otázka o aplikácii.exec() a opakovanie Qt

0

Otázka

Nie je app.exec() nekonečná slučka, ktorá sa vracia main() ?

Chcem slučky server komunikáciu nižšie, ale to si vykonané len tie a potom hlavné funkcie končí app.exec()

Som nový oboch Qt a C++, ako môžem spravovať tento looping?

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

---------UPDATE---------

Vytvoril som túto niť v vlákno.h

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

v thread.cpp som vyhlásil metóda:

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

v main.cpp volal som to:

QThread *thread = new QThread();

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

thread->start();

Som si Error: Class declaration lacks Q_OBJECT macro. Nemá QThread zdediť QObject? Ako môžem zavolať slučky správne?

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

Najlepšiu odpoveď

0

Jedným z hlavných projektov pracujem na práve teraz používa Qt a ZMQ - Váš ZMQ zásuvky potrebu žiť vo vnútri QObject ktorý beží na aplikácie prípade slučky, nie vo vnútri main() funkcia vašu aplikáciu

Tu je veľmi skrátenú pohľad, ako jeden z našich ZMQ zásuvky komunikuje na Qt prípade slučky - app má ZMQ_SUB pätica pripojený k ZMQ_PUB zásuvky na druhom konci vydavateľstvo udalosti z hardvérového rozhrania

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
}

V podstate, app.exec() MÁ vytvoriť nekonečné slučky, ale že slučka existuje v rámci QApplication objekt, nie ten, ktorý sa len opakovane spustí main() funkcia, kde to bolo volané z, a využiť, že slučka vašej žiadosti by sa mali vytvoriť ďalšie prípady QObject podtried a používať signal/slot/QEvent/QTimer mechanizmy vykonávať opatrenia v reakcii na používateľa činnosti/vstup udalosti/časových intervaloch

2021-11-23 18:47:50

Ďakujem za vysvetlenie, ale to je naozaj pre mňa ťažké realizovať. Je možné ísť cez túto situáciu, že používate kódy, ktoré som napísal vyššie?
noobie

Vo vašej otázke ste vyhlásili, "som nový oboch Qt a C++" - ste nový programovanie vo všeobecnosti, alebo si písané v iných jazykoch, a vy ste len teraz snaží niečo, čo v C++/Qt prvýkrát? Pýtam sa, pretože to, čo sa pokúšate tu nie je niečo, čo by som odporučil snaží implementovať ako začiatočník programátor, kým ste sa dostali oveľa viac oboznámení so jazyka vo všeobecnosti, a potom zoznamujú sa s ako Qt udalostí aplikácie slučky a signal/slot mechanizmy práce, ako sú základné mechanizmy pre písanie Vývoj aplikácií vo všeobecnosti
rdowell

V iných jazykoch

Táto stránka je v iných jazykoch

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