Întrebare despre aplicația.exec() și looping în Qt

0

Problema

Nu app.exec() o buclă infinită care se întoarce main() ?

Vreau sa bucla client server de comunicare de mai jos, dar a executat doar atunci funcția principală se termină cu app.exec()

Sunt nou atat pentru Qt și C++, cum pot gestiona acest 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();
}

---------ACTUALIZARE---------

Am creat acest fir în fir.h

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

în thread.cpp am declarat 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**********//
}

în main.cpp am numit-o:

QThread *thread = new QThread();

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

thread->start();

Am Error: Class declaration lacks Q_OBJECT macro. Nu către qthread moșteni QObject? Cum pot suna la bucla corect?

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

Cel mai bun răspuns

0

Unul dintre principalele proiecte la care lucrez in prezent foloseste Qt și ZMQ - Ta ZMQ prize nevoie pentru a trăi într-un QObject care rulează pe aplicație este bucla eveniment, nu în interiorul main() funcție de cererea dumneavoastră

Aici este un foarte prescurtată vedere cum unul de-al nostru ZMQ prize comunică pe Qt bucla eveniment - app are un ZMQ_SUB soclu conectat la un ZMQ_PUB mufa de la celălalt capăt evenimente de publicare de la o interfață hardware

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
}

În esență, app.exec() NU crea o buclă infinită, dar care există în buclă QApplication obiect, nu unul care doar în mod repetat conduce main() funcție în cazul în care acesta a fost numit de, și de a face uz de acea buclă cererea dumneavoastră ar trebui să creeze instanțe suplimentare de QObject subclase și de a folosi semnal/slot/QEvent/QTimer mecanisme pentru a efectua acțiuni ca răspuns la acțiunile utilizatorului/evenimente de intrare/intervale de timp

2021-11-23 18:47:50

Mulțumesc pentru explicație, dar acest lucru este foarte greu pentru mine să pună în aplicare. Este posibil să treacă prin această situație folosind codurile am scris mai sus?
noobie

În întrebarea dumneavoastră ați declarat "eu sunt nou la ambele Qt și C++" - ești nou la programare, în general, sau ai scris în alte limbi și de-abia acum încearcă ceva în C++/Qt pentru prima dată? Întreb pentru că ceea ce sunteți încercarea de aici nu este ceva ce mi-ar recomandăm să încercați să pună în aplicare ca un incepator programator până ați ajuns mult mai familiarizați cu limba, în general, și apoi familiarizat cu modul în care Qt aplicarea bucla de evenimente și semnal/slot mecanisme de muncă, deoarece acestea sunt mecanisme fundamentale pentru scrierea aplicațiilor Qt în general
rdowell

În alte limbi

Această pagină este în alte limbi

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