질문에 대한 응용이다.exec()및 루프에서는 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. 지 않코드를 상속하 어떤 qobject 로? 를 호출하려면 어떻게 해야 하나요?루프 제대로?

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

최고의 응답

0

하나의 메인 프로젝트 작업에 지금 사용하는 Qt 및 ZMQ-의 ZMQ 소켓이 필요 안에서 살 QObject 에서 실행되는 응용 프로그램의 이벤트 루프 안에 없 main() 의 기능 응용 프로그램

여기에 매우 요약 보는 방법 중 하나는 우리의 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 서브 클래스고를 사용하여 신호/슬/QEvent/QTimer 메커니즘을 수행하는 작업에 사용자 작업에 대한 응답/입력 이벤트/시간 간격

2021-11-23 18:47:50

감사에 대한 설명,그러나 이것은 정말 나를 위해 힘을 구현할 수 있습니다. 그것은 이동 가능하고 이를 통해 상황을 사용하여 코드를 썼을까요?
noobie

에서 당신의 질문에 당신이 말했다"나는 새로운 모두 Qt C++"-당신은 새로운 프로그래밍의 일반적 또는 당신은 다른 언어로 작성된 그리고 당신은 지금도에서는 C++/Qt 처음 시작하십니까? 나 요구하기 때문에 당신이 무엇을 하려고 여기지 않은 뭔가가 나는 추천을 구현하기 위해 노력하고 초보자로서 프로그래머 때까지 당신은 훨씬 더 잘 알고 언어에서 일반적으로,그 다음에 대해 숙지하는 방법 Qt 응용 프로그램 이벤트 루프 및 신호/슬롯 메커니즘을 일으로,이러한 기본적인 메커니즘을 쓰기 위해 Qt 응용 프로그램에서 일반
rdowell

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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