Dotaz app.exec() a opakování v Qt

0

Otázka

Není app.exec() nekonečná smyčka, která se vrací main() ?

Chci, aby smyčka server komunikace s klientem a pod, ale to se provádí jen ty a pak hlavní funkci končí app.exec()

Jsem nový jak pro Qt a C++, jak mohu spravovat tuto opakování?

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

---------AKTUALIZACE---------

Vytvořil jsem toto vlákno vlákno.h

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

v thread.cpp prohlásil jsem metoda:

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 nazval jsem to:

QThread *thread = new QThread();

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

thread->start();

Chápu Error: Class declaration lacks Q_OBJECT macro. Nemá QThread zdědit QObject? Jak mohu zavolat smyčky správně?

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

Nejlepší odpověď

0

Jedním z hlavních projektů pracuji, právě teď používá Qt a ZMQ - Vaše ZMQ zásuvky muset žít uvnitř QObject to běží na aplikaci je event loop, ne uvnitř main() funkce aplikace

Zde je velmi zkrácenou pohled na to, jak jeden z našich ZMQ zásuvky komunikuje na Qt event loop - aplikace má ZMQ_SUB socket připojen k ZMQ_PUB zásuvka na druhém konci publikování události z hardwarového rozhraní

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 podstatě, app.exec() Vytvořit nekonečnou smyčku, ale, že smyčka existuje v rámci QApplication objekt není ten, který jen opakovaně spouští main() funkce, kde to bylo voláno, a využívat smyčky, aplikace by měla vytvořit další instance QObject podtřídy a použít signál/slot/QEvent/QTimer mechanismy k provedení opatření v reakci na akce uživatele/vstupní události/časových intervalech

2021-11-23 18:47:50

Děkuji za vysvětlení, ale tohle je pro mě opravdu těžké realizovat. Je to možné, aby projít této situace pomocí kódů jsem psal výše?
noobie

Ve své otázce jste uvedl, "jsem nový obou Qt a C++" - jsou nové programování obecně, nebo máte to napsané v jiných jazycích a teď se snaží něco v C++/Qt poprvé? Ptám se, protože co se pokoušíš tu není něco, co bych doporučit snaží realizovat jako začátečník programátor, dokud jste dostali mnohem více obeznámeni s jazyka obecně, a pak seznámili s tím, jak Qt aplikace event loop a signál/slot mechanismy práce, protože se jedná o základní mechanismy pro psaní Qt aplikací obecně
rdowell

V jiných jazycích

Tato stránka je v jiných jazycích

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