• 7577阅读
  • 18回复

新手,求助线程问题,大哥们帮忙(已解决) [复制链接]

上一主题 下一主题
离线morriszy
 

只看楼主 倒序阅读 楼主  发表于: 2011-02-19
小弟新人,刚学Qt才4个月,最近写了个程序,只用了主线程,由于程序需要有耗时代码,所以现在多开了个线程,但是线程开启后,整个程序崩溃,不知道什么原因,,但是
QMyThread::QMyThread()
{
    openPort();/////////这句去掉,线程可以开启,请问是什么原因呢????????????、
}


以下是代码:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include "win_qextserialport.h"

class QMyThread : public QThread
{
    Q_OBJECT

public:
    QMyThread();
    ~QMyThread();

    void run();

signals:


private slots:



private:
    Win_QextSerialPort *myCom;

    void setPortPar();
    void openPort();

    bool isComOpen;
    QString portName;


};


#endif // MYTHREAD_H






#include "mythread.h"
#include "data.h"
#include <QMessageBox>
#include <QTimer>
#include <QDateTime>
#include <QString>
#include <QDebug>
#include <windows.h>

extern  uart_rx     uart_rxdata;        //接收数据结构体
extern  uart_tx     uart_txdata;                //发送数据结构体

QMyThread::QMyThread()
{
    openPort();
}

QMyThread::~QMyThread()
{
    terminate();
    wait();
}

void QMyThread::setPortPar()
{
    //设置波特率
    myCom->setBaudRate(BAUD115200);

    //设置数据位
    myCom->setDataBits(DATA_8);

    //设置奇偶校验
    myCom->setParity(PAR_NONE);

    //设置停止位
    myCom->setStopBits(STOP_1);

    // 设置流控
    myCom->setFlowControl(FLOW_OFF); //设置数据流控制,我们使用无数据流控制的默认设置

    // 设置线状态
    //myCom->setDtr(ui->checkBoxDTR->isChecked());
    //myCom->setRts(ui->checkBoxRTS->isChecked());

    myCom->setTimeout(500); //设置延时
}

void QMyThread::openPort()
{
    if(!isComOpen)
    {
        portName = "COM1"; //获取串口

这里我已经修改了

        //定义串口对象,并传递参数,在构造函数里对其进行初始化
        myCom = new Win_QextSerialPort(portName, QextSerialBase::EventDriven);

        //以可读写方式打开串口
        myCom->open(QIODevice::ReadWrite);
        if(!myCom->isOpen())
        {
            //QMessageBox::critical(this, tr("错误"), tr("不能打开指定串口\n请检查串口是否被占用"));
            delete myCom;

            return;
        }
        setPortPar();
        //connect(myCom, SIGNAL(readyRead()), this, SLOT(readMyCom()));

        isComOpen = true;
    }
    else
    {
        myCom->close();
        isComOpen = false;
    }

}

void QMyThread::run()
{
    qDebug()<<"thread thread:"<<currentThreadId();
    while(1)
    {
    Sleep(3000);
    uart_rxdata.preamble=0xff;
    uart_rxdata.cmd=0xff;

    //label_1->setText(tr(""));

    //openPort();
    //label_19->setText(tr("Port is open"));

    //To Check Firmware Version
    uart_txdata.preamble=0xaa;
    uart_txdata.cmd=0xff;

    //qint64 bWriteStat ;
    //bWriteStat= myCom->writeData((char *)&uart_txdata, 2);

    Sleep(5000);
    //readMyCom();

    if(uart_rxdata.preamble==0xaa)
        {
            if(uart_rxdata.cmd==0x01)
                {
                    qDebug()<<"ok";
                    //label_1->setText(tr("OK"));
                }
            else
                qDebug()<<"error 01";
                //label_1->setText(tr("NG"));
        }
    else
        qDebug()<<"error";
        //label_1->setText(tr("NG"));



    //myCom->close();
    //label_19->setText(tr("Port is Closed"));
    //pushButton_start->setEnabled(true);

    }
}





[ 此帖被morriszy在2011-02-24 08:43重新编辑 ]
VS2010+Qt4.7.0
离线jdwx

只看该作者 1楼 发表于: 2011-02-19
在哪里开启的线程,没有看到XXThread->start()?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线morriszy

只看该作者 2楼 发表于: 2011-02-19
回 1楼(jdwx) 的帖子
void MainWindow::slotStart()
{
    pushButton_start->setEnabled(false);

    myThread = new QMyThread();
    myThread->start();

}
VS2010+Qt4.7.0
离线alix0084
只看该作者 3楼 发表于: 2011-02-19
前几天我也遇到这个类似的问题
后来偷懒用moveToThread建立个多线程。。起码串口类可以在另外一个线程运行了==;
    QThread *ThSCI=new QThread;
    GSciCom *mytest=new GSciCom;    
    mytest->moveToThread(ThSCI);
    ThSCI->start();
    connect(ui.pushButton_3,SIGNAL(clicked()),mytest,SLOT(SciOpen()));
新手求教,不知道这么弄合理不?
离线alix0084
只看该作者 4楼 发表于: 2011-02-19
刚才试验了下楼主的超过10的端口号问题,发现\\\\.\\COM这么写,后面从1到1x都没问题,或许就不需要判断了吧 ?
离线morriszy

只看该作者 5楼 发表于: 2011-02-19
回 4楼(alix0084) 的帖子
那个地方其实我已经取消了,我直接设定的COM1
VS2010+Qt4.7.0
离线morriszy

只看该作者 6楼 发表于: 2011-02-19
回 3楼(alix0084) 的帖子
你这个办法是 “官方人员强烈批判的”的那个用法吗?
VS2010+Qt4.7.0
离线alix0084
只看该作者 7楼 发表于: 2011-02-19
回 6楼(morriszy) 的帖子
没记错应该是推荐的那个吧
http://hi.baidu.com/cyclone/blog/item/a33794ee00acba262cf53442.html
我按照这个帖子的最后的方法做的,Win_QextSerialPort也是继承自QObject,照葫芦画瓢试验了一下,可以用^^
离线morriszy

只看该作者 8楼 发表于: 2011-02-19
回 7楼(alix0084) 的帖子
这篇文章我看过的,再研究研究,谢谢alix0084 了
VS2010+Qt4.7.0
离线morriszy

只看该作者 9楼 发表于: 2011-02-19
回 3楼(alix0084) 的帖子
请问你的QThread *ThSCI=new QThread;
请问你的线程类要不要类化,重新写run函数啦?
[ 此帖被morriszy在2011-02-20 10:29重新编辑 ]
VS2010+Qt4.7.0
离线alix0084
只看该作者 10楼 发表于: 2011-02-20
没啊,直接用的。
但今天发现个很崩溃的问题,我这么弄在双核的电脑上看不出啥毛病,收发都正常,但拿同事的单核机器上,cpu占用达到99%。。。我是让串口的类和线程一直运行,可能这么弄不对==;
离线alix0084
只看该作者 11楼 发表于: 2011-02-20
  QThread *ThSCI=new QThread;
我自己从博客文章上推测,这个QThread在使用多线程时候没必要往里面添东西,只需要move一下就行
离线alix0084
只看该作者 12楼 发表于: 2011-02-20
void Win_QextSerialThread::run()
{
    while (!terminate)//这个原来的代码有错。
    {
        qesp->monitorCommEvent();
        Sleep(10);//加个sleep之后正常了
    }    
    terminate = false;
}

改了下代码好了。。。
while之后进入死循环了,不知道是这个串口类就有问题还是前几天迷迷糊糊改错了。。囧
离线morriszy

只看该作者 13楼 发表于: 2011-02-21
回 11楼(alix0084) 的帖子
我的已经可以运行了,Thread中不需要添加东西,move一下, Object中的槽就在次线程中执行!
唯一的一问题就是:次线程如何跟主线程通讯,更改GUI界面状态,全部用SIGNAL和SLOT的话,太多啦,还有什么好的办法吗?
VS2010+Qt4.7.0
离线morriszy

只看该作者 14楼 发表于: 2011-02-21
回 12楼(alix0084) 的帖子
Win_QextSerialPort中Win_QextSerialThread这个线程,没有使用到吧?
VS2010+Qt4.7.0
离线alix0084
只看该作者 15楼 发表于: 2011-02-21
回 13楼(morriszy) 的帖子
这个我也刚开始用qt,这方面同样不太理解......但应该没什么问题吧,作图软件都开始用qt编了,或许在槽上效率应该不错
离线alix0084
只看该作者 16楼 发表于: 2011-02-21
回 14楼(morriszy) 的帖子
我昨天下断点跟进去了,有点好奇这是因为什么,看那函数名字,或许这个串口类自己已经有了线程?只是咱们跟不到?
离线morriszy

只看该作者 17楼 发表于: 2011-02-21
回 16楼(alix0084) 的帖子
不可能的,根本就没开启线程好不,你看到xxThread->start了吗?你看到moveToThread了吗?没有哇
VS2010+Qt4.7.0
离线hrx1989

只看该作者 18楼 发表于: 2011-03-09
看了上面的文章。不是很理解。只能是继续了解。。。
快速回复
限100 字节
 
上一个 下一个