小弟新人,刚学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重新编辑 ]