在QT的界面工程中添加一个简单的线程socket通信

来源:互联网 发布:阿里云按量付费1g 编辑:程序博客网 时间:2024/06/08 08:36

最近在6410ARM板子上做了一个基于视频传输的WIFI小车,视频的采集、传输、小车的控制全在主线程内完成的,在实验小车时发现存在失控现象,所有在QT的现有程序中改写,把socket小车控制部分单独开了一个线程,发现小车运行的效果好多了。

在工程中添加C++类,myThread,继承与QThread,在myThread类中重新实现run()函数。一下是代码的简单实现。

#ifndef MYTHREAD_H#define MYTHREAD_H#include <QThread>#include <QTcpServer>#include <QTcpSocket>class myThread : public QThread{    Q_OBJECTpublic:    explicit myThread(QObject *parent = 0);protected:    void run();signals:private:    //server    QTcpServer *server;    QTcpSocket *clientConnection;    QByteArray recbuf;   //QTimer *timerSer;    char *buf;    int fd;    int reclen;public slots:private slots:    void acceptConnection();    void readClient();};#endif // MYTHREAD_H

#include "mythread.h"#include <string.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include "mydrive.h"myThread::myThread(QObject *parent) :    QThread(parent){    fd=open("/dev/mygpio",O_RDWR,0);    if(-1==fd)    {        printf("open fd error\n");    }    server=new QTcpServer();    clientConnection=new QTcpSocket();}void myThread::run(){    server->listen(QHostAddress::Any,5000); //监听    connect(server,SIGNAL(newConnection()),this,SLOT(acceptConnection()));//关联信号与槽    printf("run last\n");    exec();}void myThread::acceptConnection(){    clientConnection=server->nextPendingConnection();    //ui->labelListen->setText("connect...");    connect(clientConnection,SIGNAL(readyRead()),this,SLOT(readClient()));}void myThread::readClient(){    recbuf.clear();    recbuf=clientConnection->readAll();  //服务端读取数据    reclen=recbuf.size();    printf("recbuf len:%d\n",recbuf.size());    if(reclen>4)    {        reclen=reclen-4;    }else{        reclen=1;    }    switch (recbuf[reclen])//小车的简单控制部分    {        case 0x00:            printf("stop\n");            stopRun(fd);            break;        case 0x01:            printf("up\n");            break;        case 0x02:            printf("back\n");            backRun(fd);            break;        case 0x03:            printf("left\n");            leftRun(fd);            break;        case 0x04:            printf("right\n");            rightRun(fd);            break;        default:            printf("error\n");            break;    }}

其中mydrive.h是我定义的小车运动的函数,以及在.cpp文件中的upRun()等都是小车相关的GPIO控制函数。还有在线程中不可以调用任何界面类。

在主函数即main()函数中加入myThread mythread;  mythread.start();来开启一个新的线程。

1 0