คำตอบเกี่ยวกับเรื่องแอพประมวลผล()และการวนรอบใน Qt

0

คำถาม

ไม่ใช่ 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();
}

---------ปรับปรุง---------

ฉันสร้างขึ้นนี้เธรดอยู่ใน เส้นด้าย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? จะให้ฉันโทรหาเรื่องเหมาะสม?

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

คำตอบที่ดีที่สุด

0

หนึ่งในหลักของโครงการของฉันทำงานอยู่ตอนนี้ใช้ Qt และ ZMQ-ของคุณ ZMQ ซ็อกเก็ตต้องการมีชีวิตอยู่ QObject นั่นวิ่งบนโปรแกรมของเหตุการณ์วไม่ใช่ข้างใน main() ฟังก์ชันของโปรแกรมของคุณ

นี่คือ มา abridged องมุมมองของหนึ่งของเรา ZMQ นสื่อสารซ็อกเกตใน Qt เหตุการณ์ว-แอพฯมี ZMQ_SUB ซ็อกเกตได้เกี่ยวข้องกัน ZMQ_PUB ซ็อกเก็ตอยู่อื่นๆที่สิ้นสุดโปรแกรมจัดหน้าสิ่งพิมพ์เหตุการณ์จากฮาร์ดแวร์ส่วนติดต่อ

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
}

ในสำคัญ, app.exec() มันสร้างๆแต่นั่นวอยู่ภายใน QApplication วัตถุไม่ใช่คนนั้นซ้ำแล้วซ้ำเล่าเป็นตัวการ main() ฟังก์ชันที่มันถูกเรียกว่ามาจากรและทำให้ให้ใช้ของที่วงโปรแกรมของคุณควรจะสร้างเพิ่มเติมของโห QObject subclasses และใช้สัญญาณ/ตำแหน่ง/QEvent/QTimer mechanisms ต้องแสดงการกระทำอยู่การตอบสนอต้องการกระทำของผู้ใช้/ข้อมูลเหตุการณ์/เวลาที่ไมทิ้งช่วงนานจัง

2021-11-23 18:47:50

ขอบคุณสำหรับคำอธิบายแต่นี่มันยากสำหรับฉันด้วยอะไรซักอย่าง มันเป็นไปได้ต้องเจอกับเรื่องนี้สถานการณ์โดยใช้รหัสฉันเขียนอยู่เหนือ?
noobie

ในคำถามของคุณคุณพูด"ผมเป็นคนใหม่เพื่อทั้งสอง Qt กับ C++"-คุณใหม่เพื่อตั้งโปรแกรมอยู่ทั่วไปหรือคุณถูกเขียนด้วยกันภาษาและนายตอนนี้พยายามอะไรบางอย่างใน C++/Qt สำหรับครั้งแรก? ฉันถามเพราะสิ่งที่คุณพยายามที่นี่ไม่ใช่เรื่องที่ฉันจะขอแนะนำพยายามที่จะดำเนินเป็นเชิดแพลตตินั่มทั้งหมดไปใช่โปรแกรมเมอร์จนกว่าคุณเคยได้มากกคุ้นเคยกับภาษาทั่วไปก็ลำบากพอแล้ว familiarized ตัวเองกับวิธีที่โปรแกรม Qt เหตุการณ์วนและสัญญาณ/ตำแหน่ง mechanisms ทำงานเป็นพวกนี้เป็นสมมติฐานของ mechanisms เพื่อทำการเขียนโปรแกรม Qt ในทั่วไป
rdowell

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่