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循环
时间: 2024-03-31 12:36:08 浏览: 25
在这段程序中,`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` 定时器来定期检查是否有可读的数据。
相关问题
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() 怎么指导这个线程是运行或停止的
您可以在 MyThread 类中添加一个变量来指示线程是否应该停止运行。例如,您可以添加一个名为 `m_stop` 的布尔变量,并在 `run()` 方法中使用它来判断线程是否应该停止运行。在您想要停止线程时,可以将 `m_stop` 设置为 `true`。在 `run()` 方法中,您可以定期检查 `m_stop` 的值,如果它为 `true`,则退出 `run()` 方法,从而停止线程的运行。
以下是一个示例代码片段:
```c++
class MyThread : public QThread {
public:
MyThread() {
m_stop = false;
}
void stop() {
m_stop = true;
}
protected:
void run() override {
while (!m_stop) {
// 在这里写入线程的主要逻辑
// 定期检查 m_stop 的值,如果为 true,则退出循环
}
}
private:
bool m_stop;
};
```
当您想要停止线程时,只需调用 `stop()` 方法即可。这将设置 `m_stop` 为 `true`,并导致线程在下一次检查 `m_stop` 变量时退出 `run()` 方法。