Qtãã¬ãŒã ã¯ãŒã¯ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã®ãã¹ã¯ãããããã³ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã§æã人æ°ã®ãããã®ã®1ã€ã§ãã ãã®äººæ°ã¯é
ããæ©ãããç¹å¥ã§è²¬ä»»ã®ããã·ã¹ãã ã§Qtã䜿çšããããšã«ã¯ãªããŸããã§ããã é·ãéãQt for QNX Neutrinoã§ã®éçºã®å¯èœæ§ããããŸãã Qtã©ã€ãã©ãªã¯QNXãã©ãããã©ãŒã ããµããŒãããQt Creatoréçºç°å¢ã¯QNXã·ã¹ãã ãšã®çžäºéçšæ§ãæäŸããŸãã ãã ããçµã¿èŸŒã¿ãœãªã¥ãŒã·ã§ã³ãå«ãã·ã¹ãã ãšããŠã®QNXã«ã¯ãå¿
èŠãšãããªãæè¡ãçµã¿èŸŒãŸããŠãããããæ±çšã·ã¹ãã ã§ã¯äœ¿çšã§ããŸããã ã·ã¹ãã ãæ§ç¯ãããå€ãã®å ŽåãŠãŒã¶ãŒã¿ã¹ã¯ã®ããŒã¹ãšãªãQNX RTOSã®äž»èŠãªæ©èœã¯ã ã¡ãã»ãŒãžã®åãæž¡ãã§ãã QRRã§ã¡ãã»ãŒãžã³ã°ãåŒã³åºãSRRïŒéä¿¡/åä¿¡/å¿çïŒã¡ã«ããºã ã䜿çšããæ©èœãããã³ä»æ¥ã®Qtã¢ããªã±ãŒã·ã§ã³ã®2ã€ã®äŸïŒã¯ã©ã€ã¢ã³ããšãµãŒããŒïŒã®éçºã«ã€ããŠã話ãããããšæããŸãã
çºèŠã«ãã£ãŠçºèŠãããããšã¯ãªããäžè¬ã«ç¥ãããŠããæ
å ±ãæäŸãããŸãã ããã«ãããããããQtã¯ãç¹æ®ãªã·ã¹ãã ã®éçºè
ã«ãšã£ãŠã¯æ¯èŒçæ°ãããã¬ãŒã ã¯ãŒã¯ã§ãããæŽå²çã«ã¯æ°ãããã¯ãããžãŒã®å°å
¥ã«ã¯ããçšåºŠã®æ
£æ§ããããŸããã QNXã·ã¹ãã éçºè
ã¯Qtã®è€éãã«ç²ŸéããŠããªãå ŽåããããQtã¢ããªã±ãŒã·ã§ã³éçºè
ã¯QNXã®è©³çްãç¥ããªãå ŽåããããŸãã 1ã€ã®ãããžã§ã¯ãã§Qtã©ã€ãã©ãªã®ã°ã©ãã£ãã¯æ©èœãšQNXåºæã®ãã¯ãããžãŒã®äž¡æ¹ã䜿çšããåé¡ã解決ããã«ã¯ãç¹ã«æåã®æ®µéã§åŽåãå¿
èŠã«ãªãå ŽåããããŸãã QNXã§Qtã䜿çšããéã«éçºè
ãå¿
èŠãšããå¯èœæ§ã®ãã1ãæã§æ
å ±ãåéããããšããã®èšäºã®ç®çã§ãã
QNXã§SRRã䜿çšããå
žåçãªäŸ
Habréã§ä»¥åã«è€åã¡ãã»ãŒãžãå«ãQNXã¡ãã»ãŒãžã«ã€ããŠæ¢ã«æžããã®ã§ãçè«ã¯ãã§ã«äœããã®åœ¢ã§æ¢ç¥ã§ãããå®è·µã«é²ãããšãã§ãããšä»®å®ããŸãã ãããã£ãŠã以äžã®ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒããåŒçšããŸãã
ãã®ããã°ã©ã ã¯éåžžã«ç°¡åã§ãQNXã³ãŒã¹ã®äŸãåãäžããŠãå°ãçµã¿åãããŸããã ããã¯ãå
¥åãšããŠæååãåãåãããµãŒããŒã«éä¿¡ãããµãŒããŒã®å¿çïŒä»¥åã«éä¿¡ãããæååã®ãã§ãã¯ãµã ïŒã衚瀺ããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã§ãã ãã®äŸã§ã¯ã SETIOV()
代ããã«MsgSend()
ãã¯ããšSETIOV()
颿°ã®è€åã¡ãã»ãŒãžã䜿çšããŠãããããäžå¿
èŠãªã³ããŒãåé¿ãããŸãã ããã§æãè峿·±ãã®ã¯ã name_open()
颿°ã䜿çšããŠãµãŒããŒãèŠã€ãããµãŒããŒãšã®æ¥ç¶ã確ç«ããããšã§ãã
次ã«ããµãŒããŒã®ãœãŒã¹ã³ãŒãã確èªããŸãã
ãµãŒããŒã³ãŒãã¯ããå°ãé¢çœãã§ãã ãµãŒããŒã¯ãã¯ã©ã€ã¢ã³ãããã¡ãã»ãŒãžãåä¿¡ããŠââåŠçããŸãã å®éããã®äŸã§ã¯ã CKSUM_MSG_TYPE
éä¿¡ãããããŒã¿ã®ãã§ãã¯ãµã ã®èšç®ãšãã1ã€ã®ã¡ãã»ãŒãžã®ã¿ãCKSUM_MSG_TYPE
ãããŠããŸãã ã¯ã©ã€ã¢ã³ããname_open()
颿°ãåŒã³åºããšãå¥ã®ã¡ãã»ãŒãž_IO_CONNECT
ããµãŒããŒã«éä¿¡ãããŸãã ãµãŒããŒã¯ãã¡ãã»ãŒãžã«å ããŠããµãŒãã¹ã€ã³ãã«ã¹_PULSE_CODE_DISCONNECT
ããã³_PULSE_CODE_UNBLOCK
åŠçã§ããŸãã ãã®åçŽãªäŸã§ã¯ããµãŒãã¹ã¡ãã»ãŒãžã®åŠçã¯ååãšããŠäžèŠã§ãã
ãµãŒããŒæäœã¢ã«ãŽãªãºã ã¯éåžžã«ç°¡åã§ãã åæåãæåã«å®è¡ãããŸãããã®å Žåã name_attach()
颿°ã䜿çšããåå宣èšãè¡ããããã®åŸã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒãèŠã€ããããšãã§ããŸãã ãã以éã®ãµãŒããŒæäœã¯ãæ°žç¶çãªãµã€ã¯ã«ãã§ãã ãµã€ã¯ã«ã®æåã«ããµãŒããŒã¯MsgReceive()
åŒã³åºãã§ãããã¯ãããã¯ã©ã€ã¢ã³ãããã®ã¡ãã»ãŒãžãåŸ
æ©ããŸãã ã¡ãã»ãŒãžãŸãã¯ããŒãããŒããå°çãããšãQNXã³ã¢ã¯ãµãŒããŒã®ããã¯ãè§£é€ããåä¿¡ããã¡ãã»ãŒãžã®åŠçãéå§ããŸãã ãã®äŸã§ã¯ããŠããªã³ãŠããªã³msg_buf_t
ã䜿çšããŠã¡ãã»ãŒãžãåä¿¡ããŸãã ããã¯ãå¯èœãªã¡ãã»ãŒãžã¿ã€ãïŒããã³ã¡ãã»ãŒãžã¯éåžžCèšèªæ§é ã«ãã£ãŠèšè¿°ãããïŒãçµåã«çµåãããå Žåã®QNXã®äžè¬çãªæ¹æ³ã§ãã MsgReceive()
ã䜿çšããŠæçšãªCKSUM_MSG_TYPE
ã¡ãã»ãŒãžãåä¿¡CKSUM_MSG_TYPE
ãŸãããããããŒã®ã¿ãåãå
¥ããããããŒã¿ãµã€ãºã瀺ãããŸãã ããŒã¿ã¯ã MsgRead()
颿°ã䜿çšããŠMsgRead()
ãŸãã ã¯ã©ã€ã¢ã³ããžã®å¿çã¯MsgReply()
颿°ã䜿çšããŠéä¿¡ããããšã©ãŒã®å Žåã¯MsgReply()
ãéä¿¡ãããŸãã ã€ã³ãã«ã¹ã«ã¯çãã¯å¿
èŠãããŸããã
å®å
šãæãããã«ãããããŒãã¡ã€ã«ã®ããã¹ããåŒçšããŸãã ãã®ããããŒãã¡ã€ã«ã¯ãµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§äœ¿çšãããåŸã§èŠãããã«ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®QtããŒãžã§ã³ããã®ãã¡ã€ã«ã䜿çšããŸãã å¿
èŠãªããããŒãã¡ã€ã«ãå«ããã¡ãã»ãŒãžããããŒCKSUM_MSG_TYPE
æ§é ã宣èšããããšãç®çãšããŠããŸãã
iov_server.h #ifndef _IOV_SERVER_H_ #define _IOV_SERVER_H_ #include <sys/dispatch.h> #include <sys/neutrino.h> #include <sys/iomsg.h> #include <errno.h> #define CKSUM_SERVER_NAME "cksum" #define CKSUM_MSG_TYPE (_IO_MAX + 2) typedef struct { uint16_t msg_type; unsigned data_size; } cksum_header_t; // checksum reply is an int #endif //_IOV_SERVER_H_
以äžã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®ã³ã³ãœãŒã«ããŒãžã§ã³ãã©ã®ããã«æ©èœãããã®äŸã瀺ããŠããŸãã

ãŸããã¯ã©ã€ã¢ã³ãããã®ã¡ãã»ãŒãžãæåŸ
ãããµãŒããŒãèµ·åããŸãã ã¯ã©ã€ã¢ã³ããèµ·åãããšãæååãHelloãQNXïŒããåŒæ°ãšããŠç€ºãããåäœäžã«ã¯ã©ã€ã¢ã³ããšãµãŒããŒã¯èšºæã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«åºåããããã䜿çšããŠããã°ã©ã ã®åäœã倿ã§ããŸãã ããã°ã©ã ã¯æåŸ
ã©ããã«åäœããQtã§ã°ã©ãã£ã«ã«ãªãã·ã§ã³ã®èšè¿°ãéå§ã§ããŸãã ãŸããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã調æŽããŸãã
Qtã¯ã©ã€ã¢ã³ãã®äŸ
Qt Creatorã§Qtã¢ããªã±ãŒã·ã§ã³ãéçºããŸãã ãã®å ŽåãQNXã®ã¢ããªã±ãŒã·ã§ã³ãéçºããããã»ã¹ã¯ãäžè¬ã«ä»ã®OSã®ã¢ããªã±ãŒã·ã§ã³ãéçºããããã»ã¹ãšå€ãããŸããã çµå±ã®ãšãããQtã¯ã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ã§ãã Qt Creatorã§QNXã®ããããäœæããã ãã§ãã
Qt Widgets Applicationã®ãããªæ°ããã¢ããªã±ãŒã·ã§ã³ãããžã§ã¯ããäœæããŸãã åæã«ãQt Creatorã¯ããŠã£ã³ããŠã®ãã©ãŒã ãå«ãå¿
èŠãªãã¹ãŠã®ãã¡ã€ã«ãæºåããŸãã ã¯ã©ã€ã¢ã³ãã®å ŽåããŠã£ã³ããŠåœ¢ç¶ã¯æ¬¡ã®åœ¢åŒã«çž®å°ãããŸãã

ãã©ãŒã ã«ã¯ããµãŒããŒã«éä¿¡ãããããã¹ãïŒããã¹ãïŒãå
¥åããããã®ãã£ãŒã«ãããµãŒããŒã«æ¥ç¶ïŒæ¥ç¶ïŒããã³åæïŒåæïŒããããã®ãã¿ã³ããµãŒããŒã«ã¡ãã»ãŒãžãéä¿¡ããããã®ãã¿ã³ïŒèšç®ïŒãåä¿¡ãããã§ãã¯ãµã ã衚瀺ããããã«äœ¿çšãããå
¥åãã£ãŒã«ãïŒcksumïŒãå«ãŸããŸããµãŒããŒãããã³èšºæã¡ãã»ãŒãžã®åºåé åïŒã¹ããŒã¿ã¹ïŒã
ãµãŒããŒã§åäœããã°ã©ãã£ãã¯ãã©ãŒã ã®ããžãã¯ãåŠçããã³ãŒããèšè¿°ããã ãã§ãã ãã®çµæã次ã®MainWindow
ã¯ã©ã¹ãååŸããŸãã
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "../iov_server.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); public slots: void log(QString msg); void showCrc(QString crc); private slots: void qnxConnect(); void qnxDisconnect(); void calculate(); private: Ui::MainWindow *ui; int coid; // Connection ID to server }; #endif // MAINWINDOW_H
mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDateTime> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); coid = -1; connect(ui->connect, SIGNAL(clicked()), this, SLOT(qnxConnect())); connect(ui->disconnect, SIGNAL(clicked()), this, SLOT(qnxDisconnect())); connect(ui->calc, SIGNAL(clicked()), this, SLOT(calculate())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::qnxConnect() { // check if we already connected if ( coid >= 0 ) return; // connect to the server coid = name_open(CKSUM_SERVER_NAME, 0); if ( coid < 0 ) { log(QString(tr("Can't connect to server: ")).append(strerror(errno))); return; } log(tr("Connected to server")); ui->connect->setEnabled(false); ui->disconnect->setEnabled(true); ui->calc->setEnabled(true); } void MainWindow::qnxDisconnect() { // check if we already disconnected if ( coid < 0 ) return; // disconnect from the server int status = name_close(coid); if ( status < 0 ) { log(QString(tr("Can't disconnect from server: ")).append(strerror(errno))); return; } log(tr("Disconnected from server")); coid = -1; ui->calc->setEnabled(false); ui->disconnect->setEnabled(false); ui->connect->setEnabled(true); } void MainWindow::calculate() { ui->disconnect->setEnabled(false); ui->calc->setEnabled(false); // get the data QString data = ui->text->toPlainText(); log(QString(tr("Sending the following text to checksum server: %1")).arg(data)); // build the header cksum_header_t hdr; // msg header will specify how many bytes of data will follow hdr.msg_type = CKSUM_MSG_TYPE; hdr.data_size = data.length() + 1; // setup the message as a two part iov, first the header then the data iov_t siov[2]; // create a 2 part iov SETIOV(&siov[0], &hdr, sizeof(hdr)); SETIOV(&siov[1], data.toAscii().data(), hdr.data_size); // and send the message off to the server int incoming_checksum; // space for server's reply int status = MsgSendvs(coid, siov, 2, &incoming_checksum, sizeof(incoming_checksum)); if ( status < 0 ) { log(QString(tr("Can't send message to server: ")).append(strerror(errno))); return; } log(QString(tr("MsgSend return status: %1")).arg(status)); showCrc(QString::number(incoming_checksum)); } void MainWindow::showCrc(QString crc) { ui->cksum->setText(crc); ui->disconnect->setEnabled(true); ui->calc->setEnabled(true); } void MainWindow::log(QString msg) { ui->status->append(msg.prepend(QDateTime::currentDateTime().toString("hh:mm:ss "))); }
main.cppãã¡ã€ã«ã¯Qt Creatorãäœæãããã®ãšåããŸãŸã§ããããããã®å
容ãåŒçšããŸããã
ããã§ã¯ãããã§è¡ã£ãããšãèŠãŠã¿ãŸãããã æåã«ãåã®äŸã®ããã«ããµãŒããŒãèµ·åããŸãã æ¬¡ã«ãQtããŒãžã§ã³ã®ã¯ã©ã€ã¢ã³ããèµ·åããŸãã [æ¥ç¶]ãã¿ã³ãã¯ãªãã¯ãããšããµãŒããŒã¯_IO_CONNECT
ã¡ãã»ãŒãžã®åœ¢åŒã§ã¯ã©ã€ã¢ã³ãã®æ¥ç¶ã«é¢ããéç¥ãåä¿¡ããŸãã æ¬¡ã«ããHelloãQNXïŒããšããããã¹ããäœæããCalcãã¿ã³ãæŒããŸããããã«ããããµãŒããŒã«ã¡ãã»ãŒãžãéä¿¡ãããŸãã éä¿¡ã€ãã³ããç»é¢ã«è¡šç€ºãããŸãã ãµãŒããŒããåä¿¡ãããã§ãã¯ãµã ã¯ãã¯ã©ã€ã¢ã³ããŠã£ã³ããŠã«è¡šç€ºãããŸãã

ãã®äŸã¯æ©èœããã¡ãã»ãŒãžã¯éåä¿¡ãããŸãããåé¡ã¯ãããŸããã§ããã ããã...ããããç§ã¯ãã¹ãŠãããã»ã©çŽ æŽãããåäœããªãã¯ãã§ããããšãç¥ã£ãŠããŸãã å®éã«ã¯ã MsgSendvs()
åŒã³åºããåŸMsgSendvs()
ã¯ã©ã€ã¢ã³ããå°ãªããšããµãŒããŒãMsgReceive()
颿°ãåŒã³åºããŸã§ãããã¯ãããŸãïŒã·ã¹ãã ã«åªå
床ã®é«ãããã»ã¹ãããå Žåã¯å€§ãããªãå¯èœæ§ããããŸãïŒã ãã®æ©èœã説æããããã«ã sleep(10)
åŒã³åºãsleep(10)
ã®åœ¢åŒã®é
å»¶calculate_checksum()
ãµãŒããŒã®é¢æ°calculate_checksum()
ã³ãŒãã«è¿œå sleep(10)
ããŸããã ãµãŒããŒã§ãã®ãããªé
å»¶ãçºçãããšãã¯ã©ã€ã¢ã³ãã10ç§éãããã¯ããããµãŒããŒã®ã°ã©ãã£ã«ã«ãŠã£ã³ããŠãé¡èã«ãããªãŒãºãããŸãã
å Žåã«ãã£ãŠã¯ãç¹ã«ãµãŒããŒãã¯ã©ã€ã¢ã³ãã«å³åº§ã«å¿çããå ŽåïŒã€ãŸããæ
å ±ã¯åžžã«ãµãŒããŒã§å©çšå¯èœã§ãããå€éšããæ¥ãªãïŒãããããã³ã°ã¯åé¡ã§ã¯ãããŸããã ãŸããGUIãããªãŒãºãããšãã«ãŠãŒã¶ãŒãç·åŒµãå§ããå ŽåããããŸãã ç§ã¯ãªã¹ã¯ãåããã顧客ãç·åŒµãããããã°ã©ã ããªãªãŒã¹ããŸããã ãåçµããããã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãã¯ã©ã€ã¢ã³ãã¯å®éã«ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®ãµãŒããŒãšå¯Ÿè©±ããŠä»ã®ç®¡çæ©èœãæäŸã§ããããããµãŒããŒããå¿çãåä¿¡ãããŸã§ã¡ãã»ãŒãžãéä¿¡ããåŸãã¢ããªã±ãŒã·ã§ã³ã§ã®äœæ¥ãç¶ããããšãã§ããŸããã ããããçŸåšã®ããŒãžã§ã³ã®ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã¯ç§ãã¡ã«é©ããŠããŸããã ãããã£ãŠãã¯ã©ã€ã¢ã³ãã®æ£ããå®è£
ãèŠãŠã¿ãŸãããã
æ£ããQtã¯ã©ã€ã¢ã³ãã®äŸ
ã¯ã©ã€ã¢ã³ãã®ãããã¯ã«é¢ããåé¡ãã©ã®ããã«è§£æ±ºã§ããŸããïŒ ã¯ã©ã€ã¢ã³ãã¯MsgSendvs()
ãããã¯ãMsgSendvs()
åŸãŸããã ãã ããã¡ãã»ãŒãžã䜿çšããäœæ¥ãå¥ã®ã¹ããªãŒã ã«åé¢ããããšã¯å®å
šã«åãå
¥ããããŸãã ãã®å Žåã1ã€ã®ã¹ã¬ãããã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããä»ã®ã¹ã¬ãããSRRã¡ã«ããºã ãå®è£
ããŸãã Qtã§ã¹ã¬ãããæäœããã«ã¯ã QThread
ã¯ã©ã¹ã䜿çšããŸãã SRRå®è£
ã¯ãå¥ã®Sender
ã¯ã©ã¹ã«å®è£
ããŸãã Sender
ã¯ã©ã¹ïŒã¡ãã»ãŒãžã®æäœïŒãšMainWindow
ïŒã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ïŒéã®éä¿¡ãQtã·ã°ãã«ãšã¹ããããä»ããŠæŽçããŸãã
äžèšã®èгç¹ããã MainWindow
ã¯ã©ã¹ãã©ã®ããã«å€åããããèŠãŠã¿ãŸãããã æç¢ºã«ããããã«ãå€ãã³ãŒããæ®ãããŠããã SENDER_THREAD
ãã¯ãã远å ãããŠããã宣èšããããšãã¡ãã»ãŒãžã¯å¥ã®Qtã¹ã¬ããã§åŠçãããŸãã
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "../iov_server.h" #define SENDER_THREAD #ifdef SENDER_THREAD #include <QThread> #endif namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); #ifdef SENDER_THREAD signals: void calcCrc(int coid, QString data); #endif public slots: void log(QString msg); void showCrc(QString crc); private slots: void qnxConnect(); void qnxDisconnect(); void calculate(); private: Ui::MainWindow *ui; int coid; // Connection ID to server #ifdef SENDER_THREAD QThread senderThread; #endif }; #endif // MAINWINDOW_H
mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #ifdef SENDER_THREAD #include "sender.h" #endif #include <QDateTime> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); coid = -1; connect(ui->connect, SIGNAL(clicked()), this, SLOT(qnxConnect())); connect(ui->disconnect, SIGNAL(clicked()), this, SLOT(qnxDisconnect())); connect(ui->calc, SIGNAL(clicked()), this, SLOT(calculate())); #ifdef SENDER_THREAD Sender *sender = new Sender; sender->moveToThread(&senderThread); connect(&senderThread, SIGNAL(finished()), sender, SLOT(deleteLater())); connect(this, SIGNAL(calcCrc(int, QString)), sender, SLOT(send(int, QString))); connect(sender, SIGNAL(result(QString)), this, SLOT(showCrc(QString))); connect(sender, SIGNAL(log(QString)), this, SLOT(log(QString))); senderThread.start(); #endif } MainWindow::~MainWindow() { #ifdef SENDER_THREAD senderThread.quit(); senderThread.wait(); #endif delete ui; } void MainWindow::qnxConnect() { // check if we already connected if ( coid >= 0 ) return; // connect to the server coid = name_open(CKSUM_SERVER_NAME, 0); if ( coid < 0 ) { log(QString(tr("Can't connect to server: ")).append(strerror(errno))); return; } log(tr("Connected to server")); ui->connect->setEnabled(false); ui->disconnect->setEnabled(true); ui->calc->setEnabled(true); } void MainWindow::qnxDisconnect() { // check if we already disconnected if ( coid < 0 ) return; // disconnect from the server int status = name_close(coid); if ( status < 0 ) { log(QString(tr("Can't disconnect from server: ")).append(strerror(errno))); return; } log(tr("Disconnected from server")); coid = -1; ui->calc->setEnabled(false); ui->disconnect->setEnabled(false); ui->connect->setEnabled(true); } void MainWindow::calculate() { ui->disconnect->setEnabled(false); ui->calc->setEnabled(false); // get the data QString data = ui->text->toPlainText(); #ifdef SENDER_THREAD emit calcCrc(coid, data); #else log(QString(tr("Sending the following text to checksum server: %1")).arg(data)); // build the header cksum_header_t hdr; // msg header will specify how many bytes of data will follow hdr.msg_type = CKSUM_MSG_TYPE; hdr.data_size = data.length() + 1; // setup the message as a two part iov, first the header then the data iov_t siov[2]; // create a 2 part iov SETIOV(&siov[0], &hdr, sizeof(hdr)); SETIOV(&siov[1], data.toAscii().data(), hdr.data_size); // and send the message off to the server int incoming_checksum; // space for server's reply int status = MsgSendvs(coid, siov, 2, &incoming_checksum, sizeof(incoming_checksum)); if ( status < 0 ) { log(QString(tr("Can't send message to server: ")).append(strerror(errno))); return; } log(QString(tr("MsgSend return status: %1")).arg(status)); showCrc(QString::number(incoming_checksum)); #endif } void MainWindow::showCrc(QString crc) { ui->cksum->setText(crc); ui->disconnect->setEnabled(true); ui->calc->setEnabled(true); } void MainWindow::log(QString msg) { ui->status->append(msg.prepend(QDateTime::currentDateTime().toString("hh:mm:ss "))); }
calcCrc()
ã¯ã©ã¹ã®å®£èšã§ã¯ãã·ã°ãã«calcCrc()
ããã®å©ããåããŠã誰ã«ã©ã®ã¡ãã»ãŒãžãéä¿¡ããããSender
ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã«éç¥ããŸãã
MainWindow
ã¯ã©ã¹ã®å®è£
ã«ã¯å€§ããªå€æŽãå ããããŠããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã³ãŒããããã¯ã衚瀺ããã Sender
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã moveToThread()
ã¡ãœããã䜿çšããŠå¥ã®ã¹ã¬ããã«å²ãåœãŠãããŸãã ãã¹ãã©ã¯ã¿ã§ã¯ãã¹ã¬ãããçµäºããããšãäºæ³ãããŸãïŒ QThread
ã¯ã©ã¹ã®quit()
ããã³wait()
QThread
ïŒã calcCrc()
ã¡ãœããã®ãã¹ãŠã®ã³ãŒãã¯Sender
ã¯ã©ã¹ã«è»¢éãããã·ã°ãã«çæcalcCrc()
眮ãæããããŸããã
MainWindow
çµäºãMainWindow
ã Sender
ã¯ã©ã¹ã«ç§»åã§ããŸãã
sender.h #ifndef SENDER_H #define SENDER_H #include <QObject> #include "../iov_server.h" class Sender : public QObject { Q_OBJECT public: Sender() {} virtual ~Sender() {} signals: void result(QString data); void log(QString err); public slots: void send(int coid, QString data); }; #endif // SENDER_H
sender.cpp #include "sender.h" void Sender::send(int coid, QString data) { emit log(QString(tr("Sending the following text to checksum server: %1")).arg(data));
ããã¯ãåºæ¬çã«MainWindow
ã¯ã©ã¹ã®MainWindow
calculate()
ã¡ãœããã«å«ãŸããŠããã³ãŒãã§ãã ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®ã°ã©ãã£ã«ã«ãŠã£ã³ããŠãžã®ãšã©ãŒããã³çµæã®åºåã¯ã log()
ããã³result()
ã·ã°ãã«ã䜿çšããŠå®è£
ãããŸãã
ãã®ãããªæ¹åã«ãããã°ã©ãã£ã«ã«ã¯ã©ã€ã¢ã³ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããªãŒãºãããŸããã Sender
ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã¯å¥ã®ã¹ã¬ããã§10ç§éããã¯ãããŸãããã°ã©ãã£ãã¯ãŠã£ã³ããŠãå¶åŸ¡ã§ããŸãã æç€ºãããäŸã®çå®ã¯ç®¡çããã®ã«ç¹å¥ãªãã®ã§ã¯ãããŸããããå¯èœæ§ã¯ãããŸãã
QtãµãŒããŒã®äŸ
ã¯ã©ã€ã¢ã³ãã§å®éšããåŸãããã«ãµãŒããŒãæ£ããéçºããŸãã MsgReceive()
åŒã³åºããšããããã³ã°ãçºçããããããµãŒããŒæ©èœãServer
ã¯ã©ã¹ã«é
眮ããŸããããã¯å¥ã®ã¹ã¬ããã§åäœããŸãã ååã¯ã¯ã©ã€ã¢ã³ããšåãã§ãã ã¡ã€ã³ãŠã£ã³ããŠã®ãã©ãŒã ã¯ãã¯ã©ã€ã¢ã³ãã«å¯ŸããŠæ£çŽã«ãçž®å°ããããŸããmainwindow.uiãã³ããŒãããšãã£ã¿ãŒã§éããäžèŠãªãã¿ã³ãåé€ãã QPlainTextEdit
ã¯ã©ã¹ïŒããã¹ããªããžã§ã¯ãïŒãQTextBrowser
倿ããŸãïŒãšãã£ã¿ãŒã§èš±å¯ïŒã

MainWindow
ãµãŒããŒã¯ã©ã¹ã®å®£èšãšå®è£
ã以äžã«ç€ºããŸãã
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QThread> #include "../iov_server.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); signals: void startServer(name_attach_t* attach); public slots: void log(QString msg); void showCrc(QString crc); void showText(QString txt); void stopServer(void); private: Ui::MainWindow *ui; name_attach_t* attach; QThread serverThread; }; #endif // MAINWINDOW_H
mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "server.h" #include <QDateTime> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); Server *server = new Server; server->moveToThread(&serverThread); connect(&serverThread, SIGNAL(finished()), server, SLOT(deleteLater())); connect(this, SIGNAL(startServer(name_attach_t*)), server, SLOT(process(name_attach_t*))); connect(server, SIGNAL(result(QString)), this, SLOT(showCrc(QString))); connect(server, SIGNAL(text(QString)), this, SLOT(showText(QString))); connect(server, SIGNAL(log(QString)), this, SLOT(log(QString))); attach = name_attach(NULL, CKSUM_SERVER_NAME, 0); if ( NULL == attach ) { log(QString(tr("Can't attach name: %1")).arg(strerror(errno))); } else { serverThread.start(); emit startServer(attach); } } MainWindow::~MainWindow() { stopServer(); serverThread.quit(); serverThread.wait(); delete ui; } void MainWindow::showText(QString txt) { ui->text->setText(txt); } void MainWindow::showCrc(QString crc) { ui->cksum->setText(crc); } void MainWindow::log(QString msg) { ui->status->append(msg.prepend(QDateTime::currentDateTime().toString("hh:mm:ss "))); } void MainWindow::stopServer() { if ( NULL != attach ) { name_detach(attach, 0); } }
ãµãŒããŒãæ©èœããã«ã¯ã name_attach()
颿°ã䜿çšããŠname_attach()
ååãäœæããŸãã ã·ã°ãã«ã䜿çšããŠã attach
æ§é ããµãŒããŒã¹ããªãŒã ã«è»¢éããããã«ãã£ãŠéå§ããŸãã ãµãŒããŒã忢ããã«ã¯ãååname_detach()
颿°ãåé€ããŸãã æ®ãã¯ã¯ã©ã€ã¢ã³ãã§è¡ããããã®ãšéåžžã«äŒŒãŠããŸãã ã³ãŒããèŠãŠã¿ãŸãããïŒ
server.h #ifndef SERVER_H #define SERVER_H #include <QObject> #include "../iov_server.h" typedef union { uint16_t msg_type; struct _pulse pulse; cksum_header_t cksum_hdr; } msg_buf_t; class Server : public QObject { Q_OBJECT public: Server() {} virtual ~Server() {} signals: void result(QString data); void text(QString text); void log(QString err); public slots: void process(name_attach_t* attach); private: int calculate_checksum(char *text); }; #endif // SERVER_H
server.cpp #include "server.h" int Server::calculate_checksum(char *text) { int cksum = 0; for ( char *c = text; *c; c++ ) cksum += *c; sleep(10);
Server
ã¯ã©ã¹ã¯ã³ã³ãœãŒã«ãµãŒããŒïŒqnx_serverïŒã®2ã€ã®æ©èœãå®è£
ããã¡ãã»ãŒãžåºåã®ã¿ã倿ŽããïŒQtã·ã°ãã«/ã¹ãããã䜿çšïŒãååã¯MainWindow
ã¯ã©ã¹ã«ç»é²ãããŸãã ã°ã©ãã£ã«ã«ã¯ã©ã€ã¢ã³ãããã³ãµãŒããŒãªãã·ã§ã³ã®æäœã次ã®ã¹ã¯ãªãŒã³ã·ã§ããã«ç€ºããŸãã

ãµãŒããŒã¯å¶åŸ¡ãªãã§å€æããŸããã ãã¿ã³ãå
¥åãã£ãŒã«ãã¯ãããŸããã ã°ã©ãã£ã«ã«ãµãŒããŒãŠã£ã³ããŠã¯ããã®æäœãç£èŠããããã ãã«åœ¹ç«ã¡ãŸãã
ãããã«
ããã§ããã®ã¡ã¢ã¯çµãããŸããã ããã€ãã®äŸã®ã³ãŒããæ€èšãããQtã¢ããªã±ãŒã·ã§ã³ã§QNXã¡ãã»ãŒãžã¡ã«ããºã ãæ£ãã䜿çšããæ¹æ³ãæããã«ãªããŸããã äŸãåçŸããã人ã®ããã«ã ããããBitbucketã§å
¬éããŸãã ã ã³ãŒãã«é¢ããã³ã¡ã³ããäºæ³ããŸããããããã¯Qtã§ã®SRRã®åäœã瀺ãäŸã«ãããªãããšã«æ³šæããŠãã ããã äœæ¥ã·ã¹ãã ã§å¥ã®ããšãããŠããã¯ãã§ãããäŸããªãŒããŒããŒãããªãããã«ãã³ãŒãã¯åçŽåããããã°ããã®éç®ãéããŸããã ããã§ããèªè
ã®1人ãäŸã®ã³ãŒããæ¹åãããããšã©ãŒãä¿®æ£ãããããããã®å
·äœçãªææ¡ãæã£ãŠããå Žåã¯ãå¯èœã§ããã°ããããèæ
®ããŸãã ãããã®åé¡ã«é¢ããå人çãªã¡ãã»ãŒãžããé¡ãããŸãã