qt之中一个类的多个实例使用Qmutex锁的问题

我的Qt项目中有一个类A,在A下创建一个新的线程,线程执行完之后又向A类返回两个
数组,在A类中我需要把返回的数组转换成QImage类型并用paintEvent显示,由于显示
和转换不能同时进行,所以加了一个互斥两Qmutex,这样在A只有一个实例的时候没有
问题,但是当A有多个实例的时候就会出现问题,一个实例中的Qmutex锁上之后,其他实例里面Qmutex之间的代码段都无法运行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Qt超新手遇到问题,无从下手,特来请教
学习了几天qt,尝试使用Qt 5.2.0里自带的Qt creator编写一个多线程的小应用:三类线程put、get、move,put线程不断向buffer1放东西,get从buffer2里取东西,move负责将buffer1里的东西放入buffer2,在Mainwindow中设置两个textbrowser,用来实时显示put、get、move的具体动作。现在编译时遇到问题,显示构建错误,忽略了错误执行,主窗口出现了,但两个textbrowser中什么都没显示。 希望高手们能帮帮忙! MainWindow.cpp:` #include "mainwindow.h" #include <QMutex> #include <QSemaphore> #include <QStack> QMutex mutex1,mutex2; QSemaphore free1(12),free2(9); //buffer1与buffer2的空闲区 QSemaphore used1(0),used2(0); //buffer1与buffer2的已用区 QStack<char> stack1,stack2; bool stop = false; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { this->setGeometry(200,200,1000,800); this->setMaximumSize(1000,800); label1 = new QLabel(this); label1->setGeometry(150,200,100,50); label1->setText(QString(tr("Buffer1[12]:"))); label2 = new QLabel(this); label2->setGeometry(600,200,100,50); label2->setText(QString(tr("Buffer2[9]:"))); pressed = false; pushbutton = new QPushButton(tr("paused"),this); pushbutton->setGeometry(470,100,70,50); textbrowser1 = new QTextBrowser(this); textbrowser1->setGeometry(150,300,300,450); textbrowser2 = new QTextBrowser(this); textbrowser2->setGeometry(600,300,300,450); for(int i=0;i<PUTNUM;i++) { put[i] = new Put(); } move = new Move(); for(int i=0;i<GETNUM;i++) { get[i] = new Get(); } for(int i=0;i<PUTNUM;i++) { put[i]->start(); } move->start(); for(int i=0;i<GETNUM;i++) { get[i]->start(); } connect(pushbutton,&QPushButton::clicked,this,&MainWindow::pause); connect(put[0],&Put::putact,this,&MainWindow::dealputact); connect(put[1],&Put::putact,this,&MainWindow::dealputact); connect(put[2],&Put::putact,this,&MainWindow::dealputact); connect(put[2],&Put::putact,this,&MainWindow::dealputact); connect(move,&Move::moveact,this,&MainWindow::dealmoveact); connect(get[0],&Get::getact,this,&MainWindow::dealgetact); connect(get[1],&Get::getact,this,&MainWindow::dealgetact); connect(get[2],&Get::getact,this,&MainWindow::dealgetact); connect(get[3],&Get::getact,this,&MainWindow::dealgetact); connect(get[4],&Get::getact,this,&MainWindow::dealgetact); } MainWindow::~MainWindow() { delete put[PUTNUM]; delete get[GETNUM]; delete move; } void MainWindow::dealputact(char p) { QString string1(tr("Put :")); string1.append(p); textbrowser1->append(string1); } void MainWindow::dealmoveact(char m) { QString string1(tr("Move :")),string2(tr("To :")); string1.append(m); string2.append(m); textbrowser1->append(string1); textbrowser2->append(string2); } void MainWindow::dealgetact(char g) { QString string(tr("Get :")); string.append(g); textbrowser2->append(string); } void MainWindow::pause() { pressed = !pressed; if(pressed) { pushbutton->setStyleSheet(QString("QPushButton{background-color: qlineargradient(spread:repeat, x1:0, y1:0, x2:0, y2:1, stop:0.00578035 rgba(225, 242, 250, 255), stop:0.536357 rgba(196, 229, 244, 255), stop:0.545299 rgba(150, 209, 241, 255), stop:1 rgba(110, 188, 226, 255));font: 10pt \"\345\276\256\350\275\257\351\233\205\351\273\221\";}")); } else { pushbutton->setStyleSheet(QString("QPushButton{background-color:none;font: 10pt \"\345\276\256\350\275\257\351\233\205\351\273\221\";}")); } if(stop) { mutex1.unlock(); mutex2.unlock(); for(int i=0;i<PUTNUM;i++) { put[i]->start(); } for(int i=0;i<GETNUM;i++) { get[i]->start(); } move->start(); } else { for(int i=0;i<PUTNUM;i++) { put[i]->terminate(); } for(int i=0;i<GETNUM;i++) { get[i]->terminate(); } move->terminate(); } stop=!stop; }` Put.cpp #include "Put.h" #include <QMutex> #include <QSemaphore> #include <QTime> #include <QStack> Put::Put() { } void Put::run() { extern QMutex mutex1; extern QSemaphore free1; extern QSemaphore used1; extern QStack<char> stack1; char p; while(1) { if(free1.tryAcquire()) { if(mutex1.tryLock()) { free1.acquire(); used1.release(); qsrand(QTime::currentTime().msec()); p=qrand()%26+'a'; emit putact(p); stack1.push(p); this->msleep(800); mutex1.unlock(); } } qsrand(QTime::currentTime().msec()); this->msleep(qrand()%100); } } Move.cpp #include "Move.h" #include <QMutex> #include <QSemaphore> #include <QTime> #include <QStack> Move::Move() { } void Move::run() { extern QMutex mutex1,mutex2; extern QSemaphore free1,free2; extern QSemaphore used1,used2; extern QStack<char> stack1,stack2; char m; while(1) { if(used1.tryAcquire()&&free2.tryAcquire()) { if(mutex1.tryLock()&&mutex2.tryLock()) { used1.acquire(); free1.release(); free2.acquire(); used2.release(); m = stack1.pop(); emit moveact(m); stack2.push(m); this->msleep(800); mutex1.unlock(); mutex2.unlock(); } } qsrand(QTime::currentTime().msec()); this->msleep(qrand()%100); } } Get.cpp #include "Get.h" #include <QMutex> #include <QSemaphore> #include <QTime> #include <QStack> Get::Get() { } void Get::run() { extern QMutex mutex2; extern QSemaphore free2; extern QSemaphore used2; extern QStack<char> stack2; char g; while(1) { if(used2.tryAcquire()) { if(mutex2.tryLock()) { used2.acquire(); free2.release(); g = stack2.pop(); emit getact(g); this->msleep(800); mutex2.unlock(); } } qsrand(QTime::currentTime().msec()); this->msleep(qrand()%100); } }
redHat 怎么设置可以播放声音
需要安装一些什么库和插件,出现undefined reference to `QMutex::lockInternal(之类的错误怎么解决
急!!!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 创建新线程后,执行到run函数后不执行槽函数
#include "mythread1.h" #include <QDebug> #include <QMutex> #include <QApplication> //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函数里的语句。
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 }
udp 20ms 接收保存端口数据 数据出现重复 缺失,怎么解决?有偿帮忙-急
udp 20ms 接收保存端口数据 数据出现重复 缺失,怎么解决? 代码如下: radarParaCC = new MyUdpClientRadarControl(this); radarParaCC->setUdpPort(8850); radarParaCC->setReceType(5); connect(radarParaCC ,SIGNAL(sendRadarDataFrom23(char*)) ,this ,SLOT(jiexiRadarDataFrom23(char*))); udp部分: void MyUdpClientRadarControl::InitUDPSocket() { //m_groupAddress = QHostAddress("239.255.43.21");//组播功能 m_udpSocket = new QUdpSocket(); //m_udpSocket->bind(QHostAddress::Any, m_UdpPort);//m_UdpPort m_udpSocket->bind(m_UdpPort); //udpSocket->bind(45454, QUdpSocket::ShareAddress); //udpSocket->joinMulticastGroup(groupAddress);//加入组播 connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(dataReceived()), Qt::DirectConnection); connect(this ,SIGNAL(_sendData()) ,this ,SLOT(dataSend())); } //接收数据 QMutex mutex; void MyUdpClientRadarControl::dataReceived() { char charCheck;//校验位,反正顺序的错位 while (m_udpSocket->hasPendingDatagrams())//hasPendingDatagrams返回true时表示至少有一个数据报在等待被读取 { /*QReadWriteLock lock; lock.lockForWrite(); lock.lockForRead();*/ qint64 iSize = m_udpSocket->pendingDatagramSize(); //接收的消息包:1字节消息类型+1字节结构类型+4字节消息长度+实际消息体 //_StructNetMsg acceptmsg; char accepd[27000]; //memset(accepd, 0, sizeof(accepd) / sizeof(char));//清空端口数据的缓存 qint64 iresult = m_udpSocket->readDatagram(accepd, iSize); WORD aa =(unsigned char)accepd[0]; WORD aa1 = (unsigned char)accepd[1]; WORD aa2 =(unsigned char) accepd[2]; WORD aa3 =(unsigned char) accepd[3]; WORD aa4 =(unsigned char) accepd[4]; WORD aa5 = (unsigned char)accepd[5]; WORD aa6 =(unsigned char) accepd[6]; if(iresult >0) { //allmsg.push_back(acceptmsg); //HG_ProOne_MainShow::instance()->w->dct->jiexiAdsbData(acceptmsg); if(m_receType == 1) { if(accepd[0] == 'M' &&accepd[1] == 'S' &&accepd[2] == 'G') { QString acceptmsg = accepd;// emit sendAdsbData(acceptmsg); } } else if(m_receType == 2) { emit sendYunTaiData(accepd); } else if(m_receType == 3) { emit sendRadarData(accepd); } else if(m_receType == 5) { /*msleep(10);*/ //对包的校验顺序进行验证 mutex.lock(); emit sendRadarDataFrom23(accepd);//@question mutex.unlock(); /* msleep(2);*/ //charCheck = accepd[2];//校验位,反正顺序的错位 /*m_udpSocket->reset();*/ /*qDebug() << (int)accepd[2]<<endl;*/ } //int a = 0; } //将接收到的数据入数据中心层 //memset(accepd, 0, sizeof(accepd) / sizeof(char));//清空端口数据的缓存 //HG_ProOne_MainShow::instance()->w->dct->ddfn->DealDataForNetputinReceiveData(m_iPNumber, acceptmsg);//putinReceiveDataForXW(getonemsg); /* m_udpSocket->*/ /*lock.unlock();*/ } } 保存文件部分: void RadarControl::jiexiRadarDataFrom23(char* corData) { mutex1.lock(); QStringList sections = luJCaiDada.split(QRegExp("[#]")); //把每一个块装进一个QStringList中 QString xmlpath1 = sections[0] + "time"; QFile file5("D:\\2"); //char* corData1; //corData1=corData; if (file5.open(QIODevice::WriteOnly | QIODevice::Append)) { file5.open(QIODevice::WriteOnly); QDataStream out(&file5); out.writeRawData(corData, 27); } file5.close(); } 在@question处
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
实战:如何通过python requests库写一个抓取小网站图片的小爬虫
有点爱好的你,偶尔应该会看点图片文字,最近小网站经常崩溃消失,不如想一个办法本地化吧,把小照片珍藏起来! 首先,准备一个珍藏的小网站,然后就可以开始啦! 第一步 我们先写一个获取网站的url的链接,因为url常常是由page或者,其他元素构成,我们就把他分离出来,我找到的网站主页下有图片区 图片区内有标题页,一个标题里有10张照片大概 所以步骤是: 第一步:进入图片区的标题页 def getH...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
金山办公上市,雷军心愿了却!
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 11月17日,大周末的,雷军微博发了个重磅消息: “明天将是里程碑式的一天,金山办公终于成功在科创板挂牌上市了! 从1988年金山创办到今天,WPS走了整整31年。 从1999年以金山办公为主体准备上市算起,这一天,我们等了20年。 WPS和金山的历程,这是一个坚持梦想并最终取得胜利的励志故事。期待大家的祝福!”...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
碎片化的时代,如何学习
今天周末,和大家聊聊学习这件事情。 在如今这个社会,我们的时间被各类 APP 撕的粉碎。 刷知乎、刷微博、刷朋友圈; 看论坛、看博客、看公号; 等等形形色色的信息和知识获取方式一个都不错过。 貌似学了很多,但是却感觉没什么用。 要解决上面这些问题,首先要分清楚一点,什么是信息,什么是知识。 那什么是信息呢? 你一切听到的、看到的,都是信息,比如微博上的明星出轨、微信中的表情大战、抖音上的...
腾讯“疯狂”开源!
作者 | 马超 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 近日,腾讯自研的万亿级分布式消息中间件TubeMQ正式开源,并捐赠给Apache基金会,成为基金会官方认可的Incubator项目。 我们知道与TubeMQ功能类似的kafka是领英公司在早在10年前捐赠给Apache基金会的金牌项目,而那时的腾讯还在忙于3Q大战,公司文化也相对封闭,甚至连目前社交领...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
张小龙-年薪近3亿的微信之父,他是如何做到的?
张小龙生于湖南邵东魏家桥镇, 家庭主要特点:穷。 不仅自己穷,亲戚也都很穷,可以说穷以类聚。爷爷做过铜匠,总的来说,标准的劳动阶级出身。 家有兄弟两人, 一个小龙,一个小虎。 小虎好动,与邻里打成一片, 小龙好静,喜好读书。 “文静的像个妹子。”张小龙的表哥如是说。 穷文富武,做个读书郎是个不错的选择。 87年至94年, 华中科技大学本硕连读。 本科就读电信系, 不喜欢上课...
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问