void MyThread::run() { while (1){ int ret = USB_Read_Process(rx_usbcan_fifo_data[rx_usbcan_fifo_data_push], 500); // 调用USB_Read_Process函数,获取接收到的20个字节数据 //这段代码调用了USB_Read_Process函数,该函数的作用是从USB设备中读取数据,并将数据存储在Rx_dat_buf缓冲区中,读取的超时时间为5000毫秒。 //函数的返回值为一个整数类型的变量ret,表示读取数据的状态。 //具体而言,函数可能会返回以下值: //如果返回值大于0,ret是返回的读取的字节数 //如果返回值为0,则表示收到的数据长度为0,也就是没有成功接收到任何数据 //如果返回值为-1,表示读取数据失败,可能是由于USB设备连接错误或者其他原因导致。 //如果返回值为-2,表示读取数据超时,即在规定的时间内没有读取到数据。 //如果返回值为-3,表示读取数据错误,可能是由于传输的数据出现了错误或者其他原因导致。 if(ret <0 ) return; else//如果正常接收到USB数据则...... { USB_RX_shuliang++; } } }就是蛔了这个死机了
时间: 2024-03-31 08:36:18 浏览: 50
这段代码中的while(1)语句是一个无限循环,如果USB_Read_Process函数一直返回小于0的值,那么程序就会一直在这个循环中运行,无法退出。这就可能导致程序“死机”的情况。
为了避免这种情况,可以在while循环中添加一些判断条件,例如添加一个计数器,当计数器达到一定值时退出循环。另外,也可以在USB_Read_Process函数中添加一些超时机制,避免函数一直阻塞程序运行。
另外,如果程序在USB_Read_Process函数返回小于0的值时直接返回,可能导致程序无法正常退出。可以使用其他方式来结束程序的运行,例如使用QThread的quit函数,或者使用QApplication的quit函数来结束程序的运行。
相关问题
USB_Read_Process 改为int ret = USB_Read_Process(Rx_dat_buf, 500)上面的重写下
好的,根据您的要求,我对之前的示例代码进行了修改,如下所示:
// mainwidow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
QByteArray Rx_dat_buf;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyThread *thread = new MyThread(this);
thread->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
// mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
protected:
void run() override;
signals:
};
#endif // MYTHREAD_H
// mythread.cpp
#include "mythread.h"
void MyThread::run()
{
while (1)
{
int ret = USB_Read_Process(Rx_dat_buf, 500); // 调用USB_Read_Process函数,获取接收到的20个字节数据
if (ret < 0)
{
qDebug() << "USB_Read_Process error!";
return;
}
}
}
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
在这个示例代码中,我将USB_Read_Process函数的调用改为int类型,并且增加了一个超时时间参数500ms。在MyThread线程中,每次通过USB_Read_Process函数获取20个字节的数据,并将其存储在Rx_dat_buf数组中。如果USB_Read_Process函数返回值小于0,说明出现了错误,此时MyThread线程将退出并打印错误信息。
void MyThread::run() { while (1){ if(USB_Read_Start){ int ret = USB_Read_Process(rx_usbcan_fifo_data[rx_usbcan_fifo_data_push], 500); // 调用USB_Read_Process函数,获取接收到的20个字节数据 //这段代码调用了USB_Read_Process函数,该函数的作用是从USB设备中读取数据,并将数据存储在Rx_dat_buf缓冲区中,读取的超时时间为5000毫秒。 //函数的返回值为一个整数类型的变量ret,表示读取数据的状态。 //具体而言,函数可能会返回以下值: //如果返回值大于0,ret是返回的读取的字节数 //如果返回值为0,则表示收到的数据长度为0,也就是没有成功接收到任何数据 //如果返回值为-1,表示读取数据失败,可能是由于USB设备连接错误或者其他原因导致。 //如果返回值为-2,表示读取数据超时,即在规定的时间内没有读取到数据。 //如果返回值为-3,表示读取数据错误,可能是由于传输的数据出现了错误或者其他原因导致。 if(ret <0 ) return; else//如果正常接收到USB数据则...... { USB_RX_shuliang++; } } } }为什么 这个程序在没有USB数据时run会退出while循环
在这段程序中,`USB_Read_Process()` 函数是一个阻塞式的函数,当没有数据可读时,程序会一直阻塞在这个函数中,直到读取到数据或者超时为止。因此,当没有 USB 数据可读时,`USB_Read_Process()` 函数将一直阻塞,并且 `run()` 方法在 `while` 循环中也会一直等待,这将导致线程被阻塞,无法继续执行。
但是,在 `while` 循环中,没有对 `USB_Read_Start` 变量进行判断,如果 `USB_Read_Start` 变量的值为 `false`,那么线程将会一直卡在 `while` 循环中,无法继续执行。因此,如果没有 USB 数据可读,而且 `USB_Read_Start` 变量的值为 `false`,那么程序将会一直卡在 `while` 循环中。
如果你希望线程在没有 USB 数据可读时能够继续执行,可以修改程序,增加一个超时等待的机制,例如使用 `QWaitCondition` 和 `QMutex` 等线程同步机制实现等待超时功能,或者使用 `QTimer` 定时器来定期检查是否有可读的数据。
阅读全文