Qt 创建新线程后,执行到run函数后不执行槽函数

#include "mythread1.h"
#include
#include
#include

//int i = 0; //共享资源
QMutex mutex; //互斥锁

Mythread1::Mythread1()
{

}

void Mythread1::run()
{
// QString aa;
// aa.append("0123456789");
ser = new QSerialPort;
ser->setPortName("COM4");
//串口初始化
ser->setBaudRate(QSerialPort::Baud9600);
ser->setDataBits(QSerialPort::Data8);
ser->setStopBits(QSerialPort::OneStop);
ser->setParity(QSerialPort::NoParity);
//打开串口
bool ret = ser->open(QIODevice::ReadWrite);
if(!ret)
{
//QMessageBox::warning(this,"警告","打开串口失败!");
qDebug() << "打开串口失败!";
return;
}
connect(ser,SIGNAL(readyRead()),this,SLOT(recvserialdata()));
qDebug() << "打开串口成功!";

 //seekserial();

while(1)
{
    //mutex.lock();

    seekserial();
    //preventcrash();

    emit send_data(cardID);
    QThread::sleep(2);

   //mutex.unlock();
}

}

void Mythread1::recvserialdata()
{
qDebug() << "接收串口数据";
QByteArray tmpr = ser->readAll();
qDebug() << "tmpr =" << tmpr;
QString recvd;

for(int i = 0; i < tmpr.count(); i++)
{
    recvd.append(QString::number((quint8)tmpr[i],16));
    recvd.append(" ");
}

//判断命令执行是否成功
if(recvd.mid(4,1) != "0")
{
    qDebug() <<  "命令执行不成功!";
    qDebug() <<  "recvd =" << recvd;
}
else
{
    qDebug() <<  "命令执行成功!";

    qDebug() <<  "recvd =" << recvd;

    if(recvd.mid(6,1) == "4")
    {
        cardID.append("命令执行成功,读到卡号为:");
        cardID.append(recvd.mid(8,2));
        cardID.append(recvd.mid(11,2));
        cardID.append(recvd.mid(14,2));
        cardID.append(recvd.mid(17,2));

        qDebug() <<  "cardID =" << cardID;
        //cardID.clear();
    }
}

}

//寻卡
void Mythread1::seekserial()//07 02 41 01 52 e8 03
{
QByteArray tmpcmd;
tmpcmd.append((unsigned char)0x07);
tmpcmd.append((unsigned char)0x02);
tmpcmd.append((unsigned char)0x41);
tmpcmd.append((unsigned char)0x01);
tmpcmd.append((unsigned char)0x52);
//QByteArray转为unsigned char
uchar *thePointerYouNeed = (uchar *)(tmpcmd.data());
//校验和
tmpcmd.append(CalBCC(thePointerYouNeed, thePointerYouNeed[0]-2));
tmpcmd.append((unsigned char)0x03);

//发送给RFID模块
ser->write(tmpcmd);
qDebug() << "发送寻卡命令!";

}
//防冲突
void Mythread1::preventcrash()//08 02 42 02 93 00 26 03
{
QByteArray tmpcrash;
tmpcrash.append((unsigned char)0x08);
tmpcrash.append((unsigned char)0x02);
tmpcrash.append((unsigned char)0x42);
tmpcrash.append((unsigned char)0x02);
tmpcrash.append((unsigned char)0x93);
tmpcrash.append((char)0x00);
//QByteArray转为unsigned char
uchar *thePointerYouNeed = (uchar *)(tmpcrash.data());
//校验和
tmpcrash.append(CalBCC(thePointerYouNeed, thePointerYouNeed[0]-2));
tmpcrash.append((unsigned char)0x03);

//发送给RFID模块
ser->write(tmpcrash);
qDebug() << "发送防冲突命令!";

}

//校验和
unsigned char Mythread1::CalBCC(unsigned char *buf, int n)
{
int i;
unsigned char bcc = 0;
for(i = 0; i < n; i++)
{
bcc ^= *(buf+i);
}
return (~bcc);
}

代码如上,程序不会执行槽函数recvserialdata(),只执行run函数里的语句。

c++

2个回答

你应该把处理串口的数据方法用个类(SerialPortControl)封装起来,信号槽逻辑在这个类处理。线程只管调用接口即可,以下是我实现你的代码思想(简单化),不知道能不能帮上你。图片说明图片说明图片说明

子线程能运行UI函数?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
用QT写了一个0槽和信号相关的代码,代码编译成功,但是槽函数始终接收不到信号,
先看main.cpp文件: 就是定义一个线程 int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); /*定义一个线程,并且启动一个线程*/ MyThread receive_data; receive_data.start(); return a.exec(); } 然后在mainwindow.h 文件中,定义了该线程的类,同时在mainwindow类中定义了一个槽函数,在mythread中定义了一个信号 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void changeEvent(QEvent *e); private: Ui::MainWindow *ui; public slots: void print(); //我的槽函数 private slots: void on_pushButton_clicked(); }; /*创建一个线程类*/ class MyThread : public QThread { Q_OBJECT public: virtual void run(); signals: void UpdateSignal(); //我定义的类 }; 然后再mainwindow.h中实现了槽函数,并在线程中循环发送信号: /*一个线程的主函数*/ void MyThread::run() { while(1) { //开启一个死循环,每隔一秒就发送一个信号 qDebug("hello"); Sleep(1000); emit UpdateSignal(); } } void MainWindow::print() { ui->label->setText("hello"); //槽函数的实现,就是不执行 } 结果:编译也没有问题,但是槽函数就是不执行,到底是什么原因? 对了,在mainwindow的构造函数中,进行了连接 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); MyThread thread_1; connect(&thread_1, SIGNAL(UpdateSignal()), this, SLOT(print())); } 这是我全部的代码,就是不行
QMetaObject::invokeMethod 返回true,但是对应的slot函数没有执行
先上代码: ``` QMetaObject::invokeMethod(m_manager, "onEventRequest", Qt::QueuedConnection, Q_ARG(int, 0)); ``` 经过调试发现invokeMethod返回true,但是却没有执行对应的onEventRequest函数. 这些参数中: m_manager是在主线程中创建的,onEventRequest的声明: public slots: void onEventRequest(int idx); 执行invokeMethod的线程是由QThread::Run创建的 如果参数换成Qt::DirectConnection是可以调用到函数onEventRequest的声明的,但是这样就是同一个线程执行了... 我在onEventRequest函数中加了断点,发现没有执行进这个函数 请问这样的情况如何调试? 之前有没有碰到过这样的问题? 返回true的话就是说event已经在消息队列里了,那是不是有可能因为什么原因导致阻塞了消息队列?
Qt使用多线程刷新界面,界面一段时间后不响应
我设计了一个串口工作线程和界面刷新主线程。 串口线程如下: #include "thread.h" #include "mainwindow.h" #include <QDebug> #include <QMutexLocker> Thread::Thread() { //初始化 } Thread::~Thread() { mutex.lock(); abort = true; mutex.unlock(); wait(); }//析构 void Thread::run() //这就是线程的具体工作了 { // qint64 f=0; int i; int fd; int nread=1; //int nwrite int count=0;//size of writed buff fd=open("/dev/ttySAC1",O_RDONLY | O_NOCTTY); set_speed(fd,115200); if(set_Parity(fd,8,1,'N')==FALSEE) { printf("Set Parity Error\n"); exit (0); } while(!abort) { qDebug()<<"r:"<<QThread::currentThreadId(); nread=read(fd,buff1,1); qDebug()<<"rea"; if(nread>0) { buff[count]=buff1[0]; count++; // qDebug()<<count; } if(count==16) { dosomething; count=0; emit receiver16(nameflag,time,datas); msleep(85); nameflag=0; } } close(fd); } 界面主线程: #include "mainwindow.h" #include <QPainter> #include <QDebug> #include <QMutexLocker> void MyMainWindow::paintEvent(QPaintEvent *) //paintEvent函数由系统自动调用,用不着我们人为的去调用。 { QPainter paint;//1024*768 paint.begin(this); /*画一大堆东西*/ qDebug()<<"paint"; paint.end(); } MyMainWindow::MyMainWindow(QWidget *parent) :QWidget(parent) { setGeometry(0,0,1024,768); ioread= new Thread; timer = new QTimer; timerPon= new QTimer;//总共4个定时器,但结构都是这样的 ioread->start(QThread::InheritPriority); connect(ioread,SIGNAL(receiver16(int,char *,char *)),this,SLOT(display(int,char *,char *))); connect(timer, SIGNAL(timeout()), this, SLOT(timerFunction())); connect(timerPon, SIGNAL(timeout()), this, SLOT(timerFunctionPon())); //初始化; } void MyMainWindow::display(int nameflag,char *time,char *datas) { qDebug()<<"dis:"<<QThread::currentThreadId(); DoSth……; update(); } void MyMainWindow::timerFunction() { cttimerDoSth; } void MyMainWindow::timerFunctionPon() { PonttimerDoSth; } 运行了一段时间(一般是几个小时后)界面卡住不动了,定时器计时都不显示了,这是怎么回事啊?
QT 启动了一个线程,在线程中实现TCPScoket通信,但连接不到服务器了
一、刚开始做的时候直接在主线程中测试了以下程序: 1.头文件 ``` class MainWindow : public QMainWindow { Q_OBJECT private slots: void on_pushButton_clicked(); void connected(); void readyread(); private: QTcpSocket *socket; }; 2.源文件 void MainWindow::on_pushButton_clicked() { this->socket=new QTcpSocket(); this->socket->connectToHost("10.10.15.11",26,QTcpSocket::ReadWrite); connect(this->socket,SIGNAL(connected()),this,SLOT(readyread())); } void MainWindow::connected() { connect(this->socket,SIGNAL(readyRead()),this,SLOT(readyread())); } void MainWindow::readyread() { QByteArray qba = socket->readAll(); } 这个时候是可以连接并接收到数据的。 二、现在需要在QT项目中启动一个线程,这个线程专门负责TCPScoket通信接收数据,程序如下: 1.头文件 class ThreadReceive : public QThread { Q_OBJECT private slots: void connected(); void readyread(); public: void run(); private: QTcpSocket *ScoketRecv; }; 2.源文件 void ThreadReceive::run() { this->ScoketRecv=new QTcpSocket(); this->ScoketRecv->connectToHost("10.10.15.11",26,QTcpSocket::ReadWrite); connect(this->ScoketRecv,SIGNAL(connected()),this,SLOT(connected())); } void ThreadReceive::connected() { connect(this->ScoketRecv,SIGNAL(readyRead()),this,SLOT(readyread())); } void ThreadReceive::readyread() { QByteArray recvBuf=ScoketRecv->readAll(); } ``` 在主线程中启动子线程之后会跳转到void ThreadReceive::run()函数中,但 connect(this->ScoketRecv,SIGNAL(connected()),this,SLOT(readyread()));一直连接不到,也就是跳不到void ThreadReceive::readyread()中。 麻烦大神看看是哪儿有问题,谢谢!
QT中次线程的传参值怎么赋给主线程?求教
viod ProThread2::run(){ FvsImage_t mask; FvsImage_t image; FvsImage_t directionimage; FvsMinutiaSet_t minutia = minutiaSet; FvsFloatField_t direction; FvsFloatField_t frequency; MinutiaSetExtract(minutia, image, direction, mask); } 这段次线程中的minutia值如何取到主线程中去? void Widget::match(){ FvsError MatchingCompareMinutiaSets(minutia1 ,minutia2 ,a); } 如这个主线程函数中要调用minutia值。
请问windows下C++中如何让子线程中的对象调用自身的一个方法?
我现在是用QT写了一个Modbustcpclient,然后client对象中首先实例化了client后,新建线程并将其加入。 仅复制了部分关键代码。 MainWindow中 client1 = new Client(0, newClientConfig); 在Client类中 ``` Client::Client(QObject *parent, struct Client_Config Config){ modbusDevice = new QModbusTcpClient(this,config); m_thread = new QThread(); this->moveToThread(m_thread); modbusDevice->moveToThread(m_thread); connect(m_thread, SIGNAL(started()), this, SLOT(run())); } void Client::run(){ Connect(); } ``` 在该对象的run函数中,调用了Connect();方法实现了对服务器的连接。 但是如果我现在需要让这个Client发送数据,也就是调用其自身的Write方法,怎么写呢? 试过了直接在主函数中执行client1->write();是不可以的 难道我需要在run函数加一个while循环不断判断一个全局变量的值吗?
多线程互斥失败的问题
请教一下各位,我有个地方需要多个线程排队访问某个资源的问题,我有个排队 对象 queue,他有两个函数queueIn(进队列),和queueOut(出队列), 为了简单起见我这里只用了两个线程去排队,queue里面有个mutex用于互斥,queueIn里面会去lock这个互斥量,queueOut会去unlock这个互斥量,程序启动 了以后两个线程会在自己的run函数(qt,其他的类似)里面去调用queue.queueIn()进行排队,因为有互斥量的存在按道理一个线程会lock成功,而另一个线程会阻塞在里面直到前一个线程调用queueOut释放掉互斥量,但是呢结果是这两个线程居然都lock互斥量成功了,都直接通过了这个阻塞函数,互斥量居然没起到他的作用,请教一下各位大神,这种情况该怎么处理,我就是想弄个阻塞队列,让多个线程阻塞在queueIn这里,等待上一个线程资源访问完成再依次序通过,但是在目前两个线程这种简单情况下互斥量是类成员,居然表现得像是函数的局部变量一样,没起到互斥作用,请帮助解决一下,谢谢
qt 使用select监听串口时主线程被阻塞
在QT中,另起一个线程读串口,使用select监听的,可是为什么主线程也被阻塞了呢? 代码如下: thread.h ``` #ifndef DISTANCE_SERIAL_PORT_H #define DISTANCE_SERIAL_PORT_H #include <QtCore/QThread> class Distance_serial_port : public QThread { Q_OBJECT public: explicit Distance_serial_port(QObject *parent = 0); void run(); void run_once(); void setTermios(struct termios * pNewtio, int uBaudRate); void gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio); }; #endif // DISTANCE_SERIAL_PORT_H ``` thread.cpp ``` #include "distance_serial_port.h" #include <sys/time.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <assert.h> #include <iostream> #include <termios.h> #define BUF_LENGTH 6 #define DEV_NAME "/dev/tty" Distance_serial_port::Distance_serial_port(QObject *parent) : QThread() {} class CLASS_JULI{ public: CLASS_JULI(int f = -1):fd(f){ } ~CLASS_JULI() { close(fd); } int fd; }; CLASS_JULI dis_port_fds; void Distance_serial_port::run(){ while(1) { try{ run_once(); } catch(...){ std::cerr<<"distance serial port run throw exception!"<<std::endl; } sleep(1); } } void Distance_serial_port::run_once() { int ret = 0,i; unsigned char buf_read[BUF_LENGTH]; fd_set readfd; struct timeval timeout; struct termios oldtio, newtio; dis_port_fds.fd= open(DEV_NAME,O_RDONLY | O_NONBLOCK); if ((dis_port_fds.fd = open(DEV_NAME, O_RDONLY | O_NONBLOCK)) <= 0) { std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl; return ; } else { std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl; } gps_uart_init(dis_port_fds.fd,&oldtio,&newtio); assert(dis_port_fds.fd>0); while(1) { timeout.tv_sec=1; timeout.tv_usec=0; FD_ZERO(&readfd); FD_SET(dis_port_fds.fd,&readfd); ///监控函数 ret=select(dis_port_fds.fd+1,&readfd,NULL,NULL,&timeout); if(ret == -1) //错误情况 { std::cout<<"error"<<std::endl ; } else if(ret>0) //返回值大于0 有数据到来 { if(FD_ISSET(dis_port_fds.fd,&readfd)) { i=read(dis_port_fds.fd,buf_read,BUF_LENGTH); std::cout<<"----------------------------------------"<<std::endl; int m = 0; for(m = 0; m < BUF_LENGTH ; m++) { std::cout<<buf_read[m]<<" "<<std::endl; } if(buf_read[0] == 'D') { char _buf = buf_read[1]; //QBitArray ba(8); if( (_buf&0x80) == 1 ) { } else { } } break; } else //超时情况 { std::cout<<"time out"<<std::endl; continue; } } else { } } } void Distance_serial_port::setTermios(struct termios * pNewtio, int uBaudRate) { /* *clear struct for new port settings */ bzero(pNewtio, sizeof(struct termios)); //8N1 pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL; pNewtio->c_iflag = IGNPAR; pNewtio->c_oflag = 0; pNewtio->c_lflag = 0; //non ICANON } /* *设置串口的波特率9600,并刷新使其立即生效 */ void Distance_serial_port::gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio) { tcgetattr(ttyFd, oldtio); /* save current serial port settings */ setTermios(newtio, B115200); tcflush(ttyFd, TCIFLUSH); tcsetattr(ttyFd, TCSANOW, newtio); } ``` 调用方法 ``` dis_serial_prot = new Distance_serial_port(); dis_serial_prot->run(); ``` 为什么呢?难道在QT中不能使用select?
急!!!Linux编译死锁多线程在qt中报错!求大神指点!!
在qt里写的死锁多线程,但是一直报错error: collect2: error: ld returned 1 exit status; qt菜鸟感觉自己没哪里写错了,于是死都看不出bug在哪,快要die了 ``` //Pthread.h #include <QThread> #include <QDebug> class Pthread1: public QThread { Q_OBJECT protected: //线程退出的标识量 volatile bool m_stop; void run(); signals: void send_signal(int);//自定义信号 public: Pthread1(); ~Pthread1(); void stop();//线程退出的接口函数,用户使用 }; class Qthread1: public QThread { Q_OBJECT protected: //线程退出的标识量 volatile bool m_stop; void run(); signals: void send_signal(int);//自定义信号 public: Qthread1(); ~Qthread1(); void stop();//线程退出的接口函数,用户使用 }; //Pthread.cpp #include "Pthread1.h" #include <QMutex> #include <unistd.h> //用于sleep QMutex MutexA; QMutex MutexB; Pthread1::Pthread1(){ m_stop = false; } Pthread1::~Pthread1(){ } void Pthread1::stop(){ m_stop = true; } void Pthread1::run(){ int step = 0; while(!m_stop) { MutexA.lock(); step = 1; emit send_signal(step); sleep(1000); MutexB.lock(); step = 3; emit send_signal(step); MutexA.unlock(); step = 4; emit send_signal(step); msleep(1); MutexB.unlock(); step = 5; emit send_signal(step); msleep(1); } m_stop = 0; } Qthread1::Qthread1(){ m_stop = false; } Qthread1::~Qthread1(){ } void Qthread1::stop(){ m_stop = true; } void Qthread1::run(){ int step = 0; while(!m_stop) { MutexB.lock(); step = 2; emit send_signal(step); sleep(1000); MutexA.lock(); step = 6; emit send_signal(step); MutexB.unlock(); step = 7; emit send_signal(step); msleep(1); MutexA.unlock(); step = 8; emit send_signal(step); msleep(1); } m_stop = 0; } //MainWindow.h namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0); ~MainWindow(); private: Ui::MainWindow *ui; Pthread1 *p1; Qthread1 *q1; public slots: void send_cmd(int); void lock(); void unlock(); }; //MainWindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <qmessagebox.h> #include <semaphore.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> //用于sleep using namespace std; MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); p1 = new Pthread1; q1 = new Qthread1; connect(ui->pushButton_2_1_b,SIGNAL(clicked()),this,SLOT(lock())); connect(p1,SIGNAL(send_signal(int )),this,SLOT(send_cmd(int )),Qt::BlockingQueuedConnection); connect(q1,SIGNAL(send_signal(int )),this,SLOT(send_cmd(int )),Qt::BlockingQueuedConnection); } MainWindow::~MainWindow() { delete ui; } void MainWindow::send_cmd(int step){ if(step == 1){ //P1 get mutexA QPropertyAnimation *animation = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry"); animation->setDuration(1000); animation->setStartValue(QRect(530,140,141,71)); animation->setEndValue(QRect(250,420,141,71)); animation->start(); } else if(step == 2){ //Q1 get mutexB QPropertyAnimation *animation1 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry"); animation1->setDuration(1000); animation1->setStartValue(QRect(670,210,141,71)); animation1->setEndValue(QRect(110,420,141,71)); animation1->start(); } else if(step == 3){ //P2 release mutexA QPropertyAnimation *animation3 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry"); animation3->setDuration(1000); animation3->setStartValue(QRect(250,420,141,71)); animation3->setEndValue(QRect(390,420,141,71)); animation3->start(); QPropertyAnimation *animation4 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry"); animation4->setDuration(1000); animation4->setStartValue(QRect(390,420,141,71)); animation4->setEndValue(QRect(390,280,141,71)); animation4->start(); } else if(step == 4){ //P2 get mutexB QPropertyAnimation *animation5 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry"); animation5->setDuration(1000); animation5->setStartValue(QRect(530,210,141,71)); animation5->setEndValue(QRect(530,420,141,71)); animation5->start(); } else if(step == 5){ //P2 release mutexB QPropertyAnimation *animation6 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry"); animation6->setDuration(1000); animation6->setStartValue(QRect(530,420,141,71)); animation6->setEndValue(QRect(670,420,141,71)); animation6->start(); QPropertyAnimation *animation7 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry"); animation7->setDuration(1000); animation7->setStartValue(QRect(670,420,141,71)); animation7->setEndValue(QRect(670,210,141,71)); animation7->start(); } else if(step == 6){ //Q2 get mutexA QPropertyAnimation *animation9 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry"); animation9->setDuration(1000); animation9->setStartValue(QRect(390,280,141,71)); animation9->setEndValue(QRect(110,280,141,71)); animation9->start(); } else if(step == 7){ //Q2 release mutexB QPropertyAnimation *animation10 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry"); animation10->setDuration(1000); animation10->setStartValue(QRect(110,420,141,71)); animation10->setEndValue(QRect(110,210,141,71)); animation10->start(); QPropertyAnimation *animation11 = new QPropertyAnimation(ui->pushButton_2_1_2,"geometry"); animation11->setDuration(1000); animation11->setStartValue(QRect(110,210,141,71)); animation11->setEndValue(QRect(530,210,141,71)); animation11->start(); } else if(step == 8){ //Q2 release mutexA QPropertyAnimation *animation12 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry"); animation12->setDuration(1000); animation12->setStartValue(QRect(110,280,141,71)); animation12->setEndValue(QRect(110,140,141,71)); animation12->start(); QPropertyAnimation *animation13 = new QPropertyAnimation(ui->pushButton_2_1_1,"geometry"); animation13->setDuration(1000); animation13->setStartValue(QRect(110,140,141,71)); animation13->setEndValue(QRect(530,140,141,71)); animation13->start(); } } void MainWindow::lock(void) { q1->start(); p1->start(); q1->stop(); p1->stop(); q1->wait(); p1->wait(); } ``` 顺便想问一句,怎样在qt里一次创建多个线程就像Thread[ ]类似数组那样!!!
QT 中Modbus主机和下位机不能通信,不能下发数据,不能读取数据,拜托各位大神帮忙解决一下。
1.使用USB转串口测试了一下上位机中Modbus协议那部分程序,上位机机与下位机不能通信,不能下发数据,也不能读取数据。主机执行connectDevice()函数后, APF_ModbusData->ModbusMaster->state() == QModbusDevice::ConnectedState成立,执行sendReadRequest()后,返回的指针对象调用error()函数后也没有错误。按理说state()返回值等于 QModbusDevice::ConnectedState表示Modbus网络应该已经连接上了,而且error()返回值也没错,但是为什么不能下发数据和读取数据呢?程序能正常执行,但是读取数据时,发送请求和读取数都不成功。 下面是我的代码,看Modbus线程中遥测部分的程序即可 2.Modbus处理数据的线程程序 #include "ModbusDataThread.h" #include "GUIDataThread.h" #include <QVector> #include <QMutex> ``` 无 ``` int DataMode = 2; //数据处理模式选择  1.遥调;2.遥测;3.遥信; extern QMutex Mutex; void ModbusDataThread::run() { APF_ModbusData = new ModbusData; while(true) { if( APF_ModbusData->ModbusMaster->state() != QModbusDevice::ConnectedState) { int state1 = APF_ModbusData->ModbusMaster->state(); qDebug() << "state1" << state1; APF_ModbusData->Modbus_Connection(); msleep(2000); } if( APF_ModbusData->ModbusMaster->state() == QModbusDevice::ConnectedState ) { int state3 = APF_ModbusData->ModbusMaster->state(); qDebug() << "state3" << state3; qDebug() << "通信成功"; while(true) { if( DataMode == 1 ) //Modbus处理遥调数据 { Mutex.lock(); APF_ModbusData->RemoAdjust_DataTrans_Modbus(); APF_ModbusData->Modbus_ReadWriteDatas_RemoAdjust(1); RemoAdjust_GUI = RemoAdjust_Modbus; //qDebug() << RemoAdjust_GUI; DataMode = 2; Mutex.unlock(); msleep(2000); } if( DataMode == 2 ) //Modbus处理遥测数据 { Mutex.lock(); qDebug() << "遥测"; APF_ModbusData->Modbus_ReadDatas_RemoMea(1); RemoMea_GUI = RemoMea_Modbus; DataMode = 3; Mutex.unlock(); msleep(2000); } if( DataMode == 3 ) //Modbus处理遥信数据 { Mutex.lock(); qDebug() << "Modbus"; qDebug() << "遥信"; APF_ModbusData->Modbus_ReadDatas_RemoSignal(1); RemoSignal_GUI = RemoSignal_Modbus; DataMode = 2; Mutex.unlock(); msleep(2000); } } } } delete APF_ModbusData->ModbusMaster; } 3.设置串口参数和连接程序APF_ModbusData->Modbus_Connection(); ``` ``` void ModbusData::Modbus_Connection() { if (!ModbusMaster) return; QString portname = "/dev/ttyUSB0"; ModbusMaster->setConnectionParameter(QModbusDevice::SerialPortNameParameter,portname); ModbusMaster->setConnectionParameter(QModbusDevice::SerialParityParameter,QSerialPort::NoParity); ModbusMaster->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,QSerialPort::Baud9600); ModbusMaster->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,QSerialPort::Data8); ModbusMaster->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,QSerialPort::OneStop); ModbusMaster->setTimeout(1000); ModbusMaster->setNumberOfRetries(3); ModbusMaster->connectDevice(); } 4.APF_ModbusData->Modbus_ReadDatas_RemoMea() ,此为遥测发送请求和读取数据的函数 ``` ``` void ModbusData::Modbus_ReadDatas_RemoMea(int serverAddress) { if (!ModbusMaster) return; QModbusDataUnit readRequest_RemoMea(QModbusDataUnit::InputRegisters,1,100); if ( auto *Reply = ModbusMaster->sendReadRequest( readRequest_RemoMea, serverAddress)) { quint16 error_RemoMea = Reply->error(); qDebug() << "error_RemoMea" << error_RemoMea; if ( !Reply->isFinished() ) { bool a = connect(Reply, &QModbusReply::finished, this, &ModbusData:: ReadReady_RemoMea); qDebug() << a; } else { delete Reply; } } else { qDebug() << "request error"; } } 5.插槽函数ReadReady_RemoMea()为函数Modbus_ReadDatas_RemoMea()中 connect(Reply, &QModbusReply::finished, this, &ModbusData:: ReadReady_RemoMea);关联的插槽函数。 ``` ``` void ModbusData::ReadReady_RemoMea() { QModbusReply *reply = qobject_cast<QModbusReply *>(sender()); if (!reply) return; if (reply->error() == QModbusDevice::NoError) { RemoMea_Modbus = reply->result().values(); //返回读取的遥测数据 } else { qDebug() << "reply error"; } reply->deleteLater(); //delete the reply }
Qt串口通信的紧急问题
为了不影响程序其他功能,本人创建了一个线程,用新建线程接收串口数据,串口50Hz的数据。 说明:系统为Win7 64位,Qt为5.6 MingW新建线程已经通过某个按钮启动,同时也通过某个按钮停止,通过调试也能看到线程能够启动;通过串口调试工具也能收到数据。 问题1:上述程序中串口无法接收到数据。 问题2:注释掉的connect()函数用上也不能进入信号的槽函数,即也是无法收到数据。 请各位大神帮忙指导啊! 新建线程如下: 新建线程 .pro文件: QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport QT+=network QT+=serialport .h文件: #ifndef COMTHREAD_H #define COMTHREAD_H #include <QObject> #include <QThread> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> class ComThread : public QThread { Q_OBJECT public: ComThread(); //~ComThread(); void stop(); QByteArray TxData; bool comopen=false; struct ComRxData \\接收数据的结构体 { ushort head; int hyzl; int hyfk; int zyzl; int zyfk; ushort tail; }; struct ComTxData { ushort head; ushort hyfz; ushort hyzq; ushort zyfz; ushort zyzq; ushort tail; }; QSerialPort *Com1Port; QByteArray RxData; private slots: //void ComDataProcess(); protected: void run(); private: volatile bool stopped; volatile bool com_opened; }; #endif // COMTHREAD_H .cpp文件: #include "comthread.h" #include "widget.h" #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> extern volatile double HYZL; //hy指令 extern volatile double HYRT; //hy实际值 extern volatile double ZYZL; //zy指令 extern volatile double ZYRT; //zy实际值 ComThread::ComThread() { stopped=false; } void ComThread::run() { Com1Port=new QSerialPort("COM1"); //Com1Port->setPortName("COM1"); if(!com_opened&&(!stopped)) { com_opened=true; comopen=Com1Port->open(QIODevice::ReadWrite); //打开串口并设置串口参数 Com1Port->setBaudRate(QSerialPort::Baud115200); Com1Port->setDataBits(QSerialPort::Data8); Com1Port->setParity(QSerialPort::NoParity); Com1Port->setStopBits(QSerialPort::OneStop); Com1Port->setFlowControl(QSerialPort::NoFlowControl); //connect(Com1Port,SIGNAL(readyRead()),this,SLOT(ComDataProcess())); } while(!stopped) { //for(int n=0;n<10;n++) //{ //qDebug()<<n<<n<<n<<n<<n<<n<<n; //} RxData=Com1Port->readAll(); //读取串口所有的数据 if(RxData!=NULL) { ComRxData theRx; //串口接收数据的结构体 memcpy(&theRx.hyzl,&RxData.data()[2],4); HYZL=(double)theRx.hyzl/1000; memcpy(&theRx.hyfk,&RxData.data()[6],4); HYRT=(double)theRx.hyfk/1000; memcpy(&theRx.zyzl,&RxData.data()[10],4); ZYZL=(double)theRx.zyzl/1000; memcpy(&theRx.zyfk,&RxData.data()[14],4); ZYRT=(double)theRx.zyfk/1000; } if(stopped&&com_opened) { Com1Port->close(); com_opened=false; delete Com1Port; //将串口对象删除 } } stopped=false; } void ComThread::stop() { stopped=true; } //void ComThread::ComDataProcess() //{ // RxData=Com1Port->readAll(); //读取串口所有的数据 // ComRxData theRx; //串口接收数据的结构体 // memcpy(&theRx.hyzl,&RxData.data()[2],4); // HYZL=(double)theRx.hyzl/1000; // memcpy(&theRx.hyfk,&RxData.data()[6],4); // HYRT=(double)theRx.hyfk/1000; // memcpy(&theRx.zyzl,&RxData.data()[10],4); // ZYZL=(double)theRx.zyzl/1000; // memcpy(&theRx.zyfk,&RxData.data()[14],4); // ZYRT=(double)theRx.zyfk/1000; //}
python pyqt5 怎样暂停和退出指定线程?
![图片说明](https://img-ask.csdn.net/upload/201810/05/1538742487_875554.png) 怎样在点击界面的按钮暂停 或 停止 来控制线程的暂停或停止 我写的代码如下,请大神们指导下添加什么方法来控制线程 ``` # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'test1.ui' # # Created by: PyQt5 UI code generator 5.11.2 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets import time import threading import sys import os class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(387, 288) self.listWidget = QtWidgets.QListWidget(Dialog) self.listWidget.setGeometry(QtCore.QRect(110, 30, 256, 192)) self.listWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.listWidget.setObjectName("listWidget") self.widget = QtWidgets.QWidget(Dialog) self.widget.setGeometry(QtCore.QRect(20, 40, 77, 83)) self.widget.setObjectName("widget") self.verticalLayout = QtWidgets.QVBoxLayout(self.widget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.pushButton = QtWidgets.QPushButton(self.widget) self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.pushButton_2 = QtWidgets.QPushButton(self.widget) self.pushButton_2.setObjectName("pushButton_2") self.verticalLayout.addWidget(self.pushButton_2) self.pushButton_3 = QtWidgets.QPushButton(self.widget) self.pushButton_3.setObjectName("pushButton_3") self.verticalLayout.addWidget(self.pushButton_3) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.pushButton.setText(_translate("Dialog", "开始")) self.pushButton_2.setText(_translate("Dialog", "暂停")) self.pushButton_3.setText(_translate("Dialog", "停止")) class Dialog(QtWidgets.QDialog): def closeEvent(self, event): reply = QtWidgets.QMessageBox.question(self, '本程序', "是否要退出程序?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: event.accept() os._exit(0) else: event.ignore() class myThread(threading.Thread): def __init__(self, ui): threading.Thread.__init__(self) self.ui = ui self.counter = 0 def run(self): a = 0 while True: a+=1 print(a) self.ui.listWidget.addItem(str(a)) time.sleep(1) def main(): """ 主函数,用于运行程序 :return: None """ app = QtWidgets.QApplication(sys.argv) dialog = Dialog() # 注意修改为了自己重写的Dialog类 ui = Ui_Dialog() ui.setupUi(dialog) dialog.show() # 显示了自己重写的Dialog类 thread1 = myThread(ui) thread1.start() sys.exit(app.exec_()) if __name__ == '__main__': main() ```
QThread: Destroyed while thread is still running
最近发现代码有问题 QThread: Destroyed while thread is still running 线程snap_thread.cpp ``` Snap_thread::Snap_thread(QLabel *pb) :QThread() { isRunning = true; udp_fd = -1; this->pb = pb; } void Snap_thread::run() { run_socket(); } void Snap_thread::run_socket() { int len; char sendbuf[256]; //sendto中使用的对方地址 struct sockaddr_in toAddr; //在recvfrom中使用的对方主机地址 struct sockaddr_in fromAddr; unsigned int fromLen; char recvBuffer[128]; udp_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(udp_fd < 0) { printf("创建套接字失败了.\r\n"); return; } //memset()函数 memset(&toAddr,0,sizeof(toAddr)); toAddr.sin_family=AF_INET; //对方的地址和对方的主机port toAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); toAddr.sin_port = htons(this->port); sendbuf[0]=0x1; if(flag_video_press_num == GUIONTIMEONE) { str = qpath; str += "/car.jpg"; } else if(flag_video_press_num == GUIONTIMETWO) { str = qpath; str += "/goods.jpg"; } strcpy(&sendbuf[1],path); if((len=sendto(udp_fd,sendbuf,strlen(path)+2,0,(struct sockaddr*)&toAddr,sizeof(toAddr))) != strlen(path)+2) { printf("sendto() 函数使用失败了.\r\n"); } printf("%d has sent %d bytes\n",this->port,len); fromLen = sizeof(fromAddr); if(recvfrom(udp_fd,recvBuffer,128,0,(struct sockaddr*)&fromAddr,&fromLen)<0) { printf("recvfrom()函数使用失败了.\r\n"); } if(recvBuffer[0] == 2) { if(recvBuffer[1] == 1) { this->pb->setText("截图成功"); } else if(recvBuffer[1] == -1) { this->pb->setText("文件名错误"); } else { this->pb->setText("存储错误"); } } close(udp_fd); udp_fd = -1; } Snap_thread::~Snap_thread(){} void Snap_thread::setPort(int port) { this->port = port; } void Snap_thread::setPath(QString path) { this->qpath = "/mnt/ftp/"; qpath += path; } void Snap_thread::stop() { std::cout<<"this is stop!"<<std::endl; this->isRunning = false; if(udp_fd >= 0) { close(udp_fd); } this->quit(); } ``` 在主线程调用代码如下 ``` snap = new Snap_thread(ui->label_toast); snap->setPort(6000); snap->setPath(snap_save_path); snap->start(); ... if(snap->isRunning) { snap->stop(); delete snap; snap = NULL; } ``` 现在报 QThread: Destroyed while thread is still running 还有可能直接导致程序崩溃,我应该如何改成呢?
关于QT保存EXCEL文件的问题
我新开了线程新建和ECEL并写入和保存, 在主函数里有一个按钮,按钮按一次就会进入EXCEL线程,线程里完成了新建EXCEL工作簿,写入以及保存的工作,可是每一次线程结束后保存的文件都会覆盖上一次保存的文件,怎么解决? void QExcelThread::run() { CoInitializeEx(NULL, COINIT_MULTITHREADED); excel = new QAxObject(this); excel->setControl("Excel.Application"); excel->dynamicCall("SetVisible (bool Visible)","false") excel->setProperty("DisplayAlerts", false);// workBooks = excel->querySubObject("Workbooks");// 获取工作簿集合 workBooks->dynamicCall("Add"); // 新建一个工作簿 workBook = excel->querySubObject("ActiveWorkBook"); // 获取当前工作簿 sheets = workBook->querySubObject("WorkSheets"); QExcelThread::selectSheet("Sheet1"); while(!bStop) QExcelThread::setCellString(cnt+1, 1, "add"); workBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparatr(savePath+ timestr + ".xlsx"h ")); QExcelThread::close(); } #已解决,把时间放入到线程里去,每次都更新时间,就不会覆盖了 void QExcelThread::run() { QDateTime datetime; QTime current_time; QString timestr=datetime.currentDateTime().toString("yyyyMMddHHmmss");//文件保存名//日期和时间 QString timestr1;
pygame中调用pyqt5写的设置界面,只能显示一次不能多次启动,求解?
最近学习python用pygame做了一个小游戏,在拓展游戏设置和网络对战功能时,用pyqt5,Qt Designer设计了游戏设置和网络界面,发现第一次启动时能正常调用界面,但关闭之后不能再次打开,尝试过直接调用和新开线程调用,均不能解决问题,求解!? #窗口文件代码 #窗口界面代码 ``` class Ui_dialog(object): def setupUi(self, dialog): dialog.setObjectName("dialog") dialog.setWindowModality(QtCore.Qt.NonModal) dialog.resize(480, 320) self.buttonBox = QtWidgets.QDialogButtonBox(dialog) self.buttonBox.setGeometry(QtCore.QRect(240, 270, 221, 41)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.verticalLayoutWidget = QtWidgets.QWidget(dialog) self.verticalLayoutWidget.setGeometry(QtCore.QRect(9, 9, 461, 251)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget) self.label_2.setObjectName("label_2") self.verticalLayout.addWidget(self.label_2) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.radioButton_3 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_3.setEnabled(True) self.radioButton_3.setTabletTracking(False) self.radioButton_3.setChecked(True) self.radioButton_3.setObjectName("radioButton_3") self.buttonGroup = QtWidgets.QButtonGroup(dialog) self.buttonGroup.setObjectName("buttonGroup") self.buttonGroup.addButton(self.radioButton_3) self.horizontalLayout.addWidget(self.radioButton_3) self.radioButton = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton.setObjectName("radioButton") self.buttonGroup.addButton(self.radioButton) self.horizontalLayout.addWidget(self.radioButton) self.verticalLayout.addLayout(self.horizontalLayout) self.label = QtWidgets.QLabel(self.verticalLayoutWidget) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.radioButton_4 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_4.setChecked(True) self.radioButton_4.setObjectName("radioButton_4") self.buttonGroup_2 = QtWidgets.QButtonGroup(dialog) self.buttonGroup_2.setObjectName("buttonGroup_2") self.buttonGroup_2.addButton(self.radioButton_4) self.horizontalLayout_2.addWidget(self.radioButton_4) self.radioButton_5 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_5.setObjectName("radioButton_5") self.buttonGroup_2.addButton(self.radioButton_5) self.horizontalLayout_2.addWidget(self.radioButton_5) self.radioButton_10 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_10.setObjectName("radioButton_10") self.buttonGroup_2.addButton(self.radioButton_10) self.horizontalLayout_2.addWidget(self.radioButton_10) self.radioButton_11 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_11.setObjectName("radioButton_11") self.buttonGroup_2.addButton(self.radioButton_11) self.horizontalLayout_2.addWidget(self.radioButton_11) self.radioButton_6 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_6.setObjectName("radioButton_6") self.buttonGroup_2.addButton(self.radioButton_6) self.horizontalLayout_2.addWidget(self.radioButton_6) self.verticalLayout.addLayout(self.horizontalLayout_2) self.label_3 = QtWidgets.QLabel(self.verticalLayoutWidget) self.label_3.setObjectName("label_3") self.verticalLayout.addWidget(self.label_3) self.horizontalSlider = QtWidgets.QSlider(self.verticalLayoutWidget) self.horizontalSlider.setMaximum(10) self.horizontalSlider.setProperty("value", 5) self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal) self.horizontalSlider.setTickInterval(0) self.horizontalSlider.setObjectName("horizontalSlider") self.verticalLayout.addWidget(self.horizontalSlider) self.label_4 = QtWidgets.QLabel(self.verticalLayoutWidget) self.label_4.setObjectName("label_4") self.verticalLayout.addWidget(self.label_4) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.radioButton_7 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_7.setObjectName("radioButton_7") self.buttonGroup_3 = QtWidgets.QButtonGroup(dialog) self.buttonGroup_3.setObjectName("buttonGroup_3") self.buttonGroup_3.addButton(self.radioButton_7) self.horizontalLayout_3.addWidget(self.radioButton_7) self.radioButton_8 = QtWidgets.QRadioButton(self.verticalLayoutWidget) self.radioButton_8.setChecked(True) self.radioButton_8.setObjectName("radioButton_8") self.buttonGroup_3.addButton(self.radioButton_8) self.horizontalLayout_3.addWidget(self.radioButton_8) self.verticalLayout.addLayout(self.horizontalLayout_3) self.retranslateUi(dialog) self.buttonBox.accepted.connect(dialog.accept) self.buttonBox.rejected.connect(dialog.reject) self.radioButton_5.clicked.connect(self.gamedj) QtCore.QMetaObject.connectSlotsByName(dialog) dialog.setTabOrder(self.radioButton_3, self.radioButton) dialog.setTabOrder(self.radioButton, self.radioButton_4) dialog.setTabOrder(self.radioButton_4, self.radioButton_5) dialog.setTabOrder(self.radioButton_5, self.radioButton_10) dialog.setTabOrder(self.radioButton_10, self.radioButton_11) dialog.setTabOrder(self.radioButton_11, self.radioButton_6) dialog.setTabOrder(self.radioButton_6, self.horizontalSlider) dialog.setTabOrder(self.horizontalSlider, self.radioButton_7) dialog.setTabOrder(self.radioButton_7, self.radioButton_8) def retranslateUi(self, dialog): _translate = QtCore.QCoreApplication.translate dialog.setWindowTitle(_translate("dialog", "游戏设置")) self.label_2.setText(_translate("dialog", "游戏模式选择:")) self.radioButton_3.setText(_translate("dialog", "普通阶")) self.radioButton.setText(_translate("dialog", "可变阶")) self.label.setText(_translate("dialog", "游戏阶数(最高阶):")) self.radioButton_4.setText(_translate("dialog", "4")) self.radioButton_5.setText(_translate("dialog", "5")) self.radioButton_10.setText(_translate("dialog", "6")) self.radioButton_11.setText(_translate("dialog", "7")) self.radioButton_6.setText(_translate("dialog", "8")) self.label_3.setText(_translate("dialog", "游戏速度选择:")) self.label_4.setText(_translate("dialog", "道具模式选择:")) self.radioButton_7.setText(_translate("dialog", "开启")) self.radioButton_8.setText(_translate("dialog", "关闭")) #逻辑执行类 class MyMainWindow(QDialog,Ui_dialog): def __init__(self, parent = None): super(MyMainWindow, self).__init__(parent) self.setupUi(self) # 连接槽函数 #self.radioButton_5.clicked.connect(self.gamedj) #定义新增槽函数ok def gamedj(self): print(“o'k” ) #设置内容测试 #定义调用函数 def setting_ui(): app = QApplication(sys.argv) win = MyMainWindow() win.show() app.exec() #新开线程 class setui_Thread(threading.Thread): def __init__(self): super(setui_Thread, self).__init__() def run(self): currentTreadname = threading.currentThread() #测试 print("set ui running in", currentTreadname) #测试 setting_ui() setui = setui_Thread() setui.setDaemon(daemonic=True) #调用线程或函数代码片 #检测鼠标点击是否在游戏设置 if ksyx3.textRect.collidepoint(mouse_x,mouse_y): if not ai_settings.game_set: ai_settings.game_set = True #setui.run() setui.start() ``` 请各位大神答疑,谢谢!
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | gr...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
网络(8)-HTTP、Socket、TCP、UDP的区别和联系
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 一、TCP与UDP的不同 1. 是否需要建立连接。 UDP在传送数据之前不需要先建立连接;TCP则提供面向连接的服务; 2. 是否需要给出确认 对方的传输层在收到UDP报文后,不需要给出任何确认,而 TCP需要给出确认报文,要提供可靠的、面向连接的传输服务。 3.虽然UDP不提供可靠交...
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
开挂的人生!那些当选院士,又是ACM/IEEE 双料Fellow的华人学者们
昨日,2019年两院院士正式官宣,一时间抢占了各大媒体头条。 朋友圈也是一片沸腾,奔走相告,赶脚比自己中了大奖还嗨皮! 谁叫咱家导师就是这么厉害呢!!! 而就在最近,新一年度的IEEE/ACM Fellow也将正式公布。 作为学术届的顶级荣誉,不自然地就会将院士与Fellow作比较,到底哪个含金量更高呢? 学术君认为,同样是专业机构对学者的认可,考量标准不一,自然不能一概而论。 但...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库——点这里跳转 文章目录Python语言高频重点汇总**GitHub面试宝典仓库——点这里跳转**1. 函数-传参2. 元类3. @staticmethod和@classmethod两个装饰器4. 类属性和实例属性5. Python的自省6. 列表、集合、字典推导式7. Python中单下划线和双下划线8. 格式化字符串中的%和format9.
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
代码详解:如何用Python快速制作美观、炫酷且有深度的图表
全文共12231字,预计学习时长35分钟生活阶梯(幸福指数)与人均GDP(金钱)正相关的正则图本文将探讨三种用Python可视化数据的不同方法。以可视化《2019年世界幸福报告》的数据为例,本文用Gapminder和Wikipedia的信息丰富了《世界幸福报告》数据,以探索新的数据关系和可视化方法。《世界幸福报告》试图回答世界范围内影响幸福的因素。报告根据对“坎特里尔阶梯问题”的回答来确定幸...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
今年正式步入了大四,离毕业也只剩半年多的时间,回想一下大学四年,感觉自己走了不少弯路,今天就来分享一下自己大学的学习经历,也希望其他人能不要走我走错的路。 (一)初进校园 刚进入大学的时候自己完全就相信了高中老师的话:“进入大学你们就轻松了”。因此在大一的时候自己学习的激情早就被抛地一干二净,每天不是在寝室里玩游戏就是出门游玩,不过好在自己大学时买的第一台笔记本性能并不是很好,也没让我彻底沉...
如何写一篇技术博客,谈谈我的看法
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 我一直推崇学技术可以写技术博客去沉淀自己的知识,因为知识点实在是太多太多了,通过自己的博客可以帮助自己快速回顾自己学过的东西。 我最开始的时候也是只记笔记,认为自己能看得懂就好。但如果想验证自己是不是懂了,可以写成技术博客。在写技术博客的...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【设计模式】单例模式的八种写法分析
网上泛滥流传单例模式的写法种类,有说7种的,也有说6种的,当然也不排除说5种的,他们说的有错吗?其实没有对与错,刨根问底,写法终究是写法,其本质精髓大体一致!因此完全没必要去追究写法的多少,有这个时间还不如跟着宜春去网吧偷耳机、去田里抓青蛙得了,一天天的....
《面试宝典》:检验是否为合格的初中级程序员的面试知识点,你都知道了吗?查漏补缺
欢迎关注文章系列,一起学习 《提升能力,涨薪可待篇》 《面试知识,工作可待篇》 《实战演练,拒绝996篇》 也欢迎关注公 众 号【Ccww笔记】,原创技术文章第一时间推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《面试知识,工作可待篇》-Java笔试面试基础知识大全 前言 是不是感觉找工作面试是那么难呢? 在找工作面试应在学习的基础进行总结面试知识点,工作也指日可待,欢...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
微博推荐算法简述
在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推荐系统适用哪些场景?用来解决什么问题、具有怎样的价值?效果如何衡量? 推荐系统诞生很早,但真正被大家所重视,缘起于以”facebook”为代表的社会化网络的兴起和以“淘宝“为代表的电商的繁荣,”选择“的时代已经来临,信息和物品的极大丰富,让用户如浩瀚宇宙中的小点,无所适从。推荐系统迎来爆发的机会,变得离用户更近: 快...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问