QT Time 的延迟应用求教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT Time 的延迟应用求教相关的知识,希望对你有一定的参考价值。

QTime time;
time.start();
while(time.elapsed()>=spinBoxGap->value()*1000);

....

本人新的,请教啊:
spinBoxGap里是我我设置的要延迟的秒数,为什么While好像一点也没延迟。

QTime time;
time.start();
while(time.elapsed()>=spinBoxGap->value()*1000);
// 从此段代码可以看出,你是想设定一个时间间隔,执行一次循环time.elapsed(),但是你此处的time未设置间隔。具体设置好像直接start(1000)就可以了,1000单位是毫秒。,即每分钟循环执行1次。
// 给你推荐个方法采用QTimer(定时器)

timer = new QTimer();
// 设置定时器执行间隔
timer->setInterval(spinBoxGap->currentText().toInt() * 1000);
// 然后连接槽函数,执行相关操作即可
connect(timer, SIGNAL(timeout()), this, SLLOT(whatyoudo()));追问

我后面有七八个处理语句和延迟,用做每个处理都等待一段时间,用qtimer的timeout()不好处理,用qtime有什么办法吗?

追答// 你可以在线程中处理啊,完成一个后直接加个延迟就好了啊,非要用QTime吗? 
void MyThread::run()

    fun_1();
    sleep(1000); // 这里sleep中的毫秒可以用你的spinBox中的值传递过来,线程不能直接应用QSpinBox哦,通过主线程转换
    fun_2();
    sleep(2000);
    ...
追问

谢谢,不过我对线程不了解……,要是用QTime有办法吗?这也算是一种方法吧。我不想把每段处理都写成函数,

追答// 哦,这样的话办法是有,不过可能导致主线程卡住
QTime time;
time.start();
while (1)
    
    // 此处判断设置间隔时间,如果大于等于SpinBox中设置的值,那么执行
    if (time.elapsed()>=spinBoxGap->value()*1000)
    
        ...; // 这里你只能做判断,到底执行那个步骤
    
    // 一个步骤执行完成后重新启动time,让他重新开始计算
    time.restart();
    // 判断上面步骤是否执行完?如果完成结束循环
    if (!isRun)
    
        break;
       
追问

如果你的if()可以判断执行,那我的while()也应该是可以的吧?

追答

你的while你仔细看就知道执行不了。此时的time.elapsed()应该等于0,你却判断要大大于spinbox设定的值才执行,你觉得合适吗?如果你按照小于的话怎么样结束呢?感觉此处还是用if比较好。

追问

嗯,是的,我逻辑写错了,昨天试了可以延迟,但不能操作其他的,而且出现:我后面的几个延迟好像全部无效,第一个延迟是所有延迟总和,最后所有动作一块执行,不知道怎么回事。

追答

具体操作不知道你是怎么弄的,不介意的话加我QQ我帮你看看:2893891799

参考技术A 你这while语句什么都不做 就是延时你也看不出来呀 为什么不用QTimer

在用QT编程时,建了一个自己的类,但是编译时出现错误,求教大侠们如何解决

错误提示为widgetshare.cpp:12: error: no matching function for call to 'Widgetshare::connect(QTcpServer**, const char*, Widgetshare* const, const char*)',其中Widgetshare是我自己的类,类定义为//#ifndef WIDGETSHARE_H
#define WIDGETSHARE_H
#include <QtNetWork>
#include <QWidget>
#include <QTcpServer>
#include <QObject>

namespace Ui
class Widget;


class Widgetshare : public QWidget

Q_OBJECT

public:
explicit Widgetshare(QWidget *parent = 0);
~Widgetshare();

private:
Ui::Widget *ui;
QTcpServer *tcpServer;
QTcpSocket *tcpServerConnection;
qint64 totalBytes; //存放总大小信息
qint64 bytesReceived; //已收到数据的大小
qint64 fileNameSize; //文件名的大小信息
QString fileName; //存放文件名
QFile *localFile; //本地文件
QByteArray inBlock; //数据缓冲区

private slots:
void on_startButton_clicked();
void start(); //开始监听
void acceptConnection(); //建立连接
void updateServerProgress(); //更新进度条,接收数据
void displayError(QAbstractSocket::SocketError socketError);
//显示错误

;

//#endif
WIDGETSHARE_H,出错的程序文件为
#include "widgetshare.h"
#include "ui_widgetshare.h"
#include <QObject>

Widgetshare::Widgetshare(QWidget *parent):
QWidget(parent),
ui(new Ui::Widget)

totalBytes = 0;
bytesReceived = 0;
fileNameSize = 0;
QObject::connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
//当发现新连接时发出newConnection()信号


时间比较紧,可以追加分

Widgetshare::connect 改 QObject::connect追问

我用的就是QObject::connect 啊,不好使

追答

widgetshare.cpp:12: error: no matching function for call to
'Widgetshare::connect(QTcpServer**, const char*, Widgetshare* const, const char*)'
你没贴这部分出来吧
connect只有QObject::connect这个用法,有什么好不好使的

追问

上面的代码是分两部分的,下半部分的 QObject::connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
//当发现新连接时发出newConnection()信号
就是出错的代码,我用的是的QObject::connect,可是还是报那个错

追答

QObject::connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
tcpServer已是指针,不用加&

参考技术A QObject::connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
你确定 这个函数是静态函数吗?追问

刚学,不太懂静态函数什么的,能说一下怎么解决吗?

追答

楼上说的真确,函数参数不匹配,你将&取掉就好了

以上是关于QT Time 的延迟应用求教的主要内容,如果未能解决你的问题,请参考以下文章

M QT t协议有延迟

CMSIS-RTOS 时间管理之时间延迟Time Delay

延迟不到一秒,Swift 2

如何实现低于1ms的延迟?

新手求教:quartus verilog 关于timescale的问题。。

有啥办法可以延迟 Qt QEvent?