c++ - Communication between a server thread and a man-machine interface (MMI) -
i need advice on program i'm coding right now. let me first present is.
design
i'm designing man-machine interface (mmi). in mmi, there 2 core elements:
the
mainwindow
:
this mainwindow base of everything. important: here, launch in thread server
receives data client. data important next element.
supervision
this window contains qtablewidget
, goal show in pseudo-real time data received on server in thread of mainwindow.
the problem
the server in thread owned mainwindow
receive structure every 10 ms. how can send these data supervision
window if it's open? thinking of using shared memory, not sure this, , doesn't method have use.
some solutions
i tried implement solution of sebastian lange :
- an emit in thread server
- a connect in mainwindow
- a slot in supervision
so thread server
emit signal @ every frame received. how can connect in mainwindow , how supervision
receive struct emit
in signal?
here's code of emit:
mainwindow* mainwindow::m_psmainwindow = nullptr; // c++ 11 nullptr void mainwindow::emit_signal_tramerecu(structuresupervision::t_structuresupervision* ptr){ emit signal_tramerecu(ptr); } void mainwindow::lancerserveur(std::atomic<bool>& boolserver){ serveur s; structuresupervision::t_structuresupervision* bufferstructurerecu; while(boolserver){ bufferstructurerecu = s.receivedataudp(); if(bufferstructurerecu->systemdata._statutgroundflight != 0){ m_psmainwindow->emit_signal_tramerecu( bufferstructurerecu ); } } }
queued connections
qt makes cross thread communication easy when use queued connections.
your calls connect
should use qt::queuedconnection
or qt::blockingqueuedconnection
connection types.
custom types in slots , signals
to use custom types (structs) in slots, signals, qvariant , properties need declare , register type make available qt dynamic type system.
in header (.hpp) use q_declare_metatype
, in source (.cpp) use qregistermetatype
.
worked example
server.hpp
#ifndef server_hpp #define server_hpp #include <qtcore> struct customdata { int id; qdatetime tstamp; }; q_declare_metatype(customdata) class server : public qthread { q_object public: server(); signals: void senddata(const customdata& d); protected: virtual void run(); }; #endif
server.cpp
#include "server.hpp" static const int customdata_metatype_id = qregistermetatype<customdata>(); server::server() : qthread() {} void server::run() { customdata d; d.id = 0; (int = 0; < 10; ++i) { d.id++; d.tstamp = qdatetime::currentdatetime(); emit senddata(d); sleep(1); } }
window.hpp
#ifndef window_hpp #define window_hpp #include <qtgui> #include "server.hpp" class window : public qwidget { q_object public: window(); public slots: void receivedata(const customdata& d); private: qlistwidget* mlist; }; #endif
window.cpp
#include "window.hpp" window::window() : qwidget(),mlist(new qlistwidget()) { resize(400, 300); qvboxlayout* mainlayout = new qvboxlayout(); mainlayout->addwidget(mlist); setlayout(mainlayout); } void window::receivedata(const customdata& d) { qstring str(qstring("%1 %2").arg(d.id).arg(d.tstamp.tostring())); mlist->additem(str); }
main.cpp
#include <qtgui> #include "server.hpp" #include "window.hpp" int main(int argc, char** argv) { qapplication app(argc, argv); window win; server ser; qobject::connect( &ser, signal(senddata(customdata)), &win, slot(receivedata(customdata)), qt::queuedconnection); win.show(); ser.start(); return app.exec(); }
test.pro
template=app qt=core gui headers=server.hpp window.hpp sources=main.cpp server.cpp window.cpp
Comments
Post a Comment