RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 918979
Accepted
Андрей Солодовников
Андрей Солодовников
Asked:2020-12-12 19:15:55 +0000 UTC2020-12-12 19:15:55 +0000 UTC 2020-12-12 19:15:55 +0000 UTC

如何使 QTimer 工作

  • 772

项目结构如下:
device.h

#ifndef DEVICE_H
#define DEVICE_H

#include <QWidget>
class device : public QWidget
{
    Q_OBJECT
signals:
    void takeMidVal(int midVal);
public:
    device(QWidget *parent = nullptr);
public slots:
    void seek(int bin);

};

#endif // DEVICE_H

设备.cpp

#include "device.h"

device::device(QWidget *parent) :
    QWidget(parent)
{

}
void device::seek(int bin)
{
    int midVal = 800;
    emit(takeMidVal(midVal));
}

对话框.h

#ifndef DIALOG_H
#define DIALOG_H
#include <QApplication>
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <math.h>
#include <windows.h>
#define ACCEPT_DIFF         100
#define SIZE_OF_SAMPLE      10
#define SIZE_OF_NOISE       10

#define MK_SILENCE             -2
#define MK_INCORRECT_RESPONSE  -1
#define MK_WAITING              0
#define MK_CORRECT_RESPONSE     1

class Dialog : public QDialog
{
    Q_OBJECT
signals:
    void sendCommand();
    void setBinToSeek(int bin);
public:
    int configRes;
    int result;
    int midCount;
    int midValue;
    bool waitFlag;
    QPushButton* btn;
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();
public slots:
    void computeMid(int curVal);
private slots:
    void handleClick();


};

#endif // DIALOG_H

对话框.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent)
{
    QVBoxLayout *mainLayout = new QVBoxLayout;
    btn = new QPushButton();
    mainLayout->addWidget(btn);
    this->setLayout(mainLayout);
    connect(btn,SIGNAL(clicked()),this,SLOT(handleClick()));
}
void Dialog::handleClick()
{
    result = -1;
    int amplitude = 1000;
    int bin = 10;
    unsigned char min = 1;
    unsigned char max =static_cast<unsigned char>(255);
    unsigned char command = 0;
    bool success = false;
    while(max-min > 1)
    {
        command = (min + (max-min)/2);
        configRes = MK_WAITING;
        emit(sendCommand());
        while(configRes == MK_WAITING)
        {
            QApplication::instance()->processEvents();
            Sleep(100);
        }
        emit(setBinToSeek(bin));
        waitFlag = true;
        midCount = 0;
        midValue = 0;
        int sleepCount = 0;
        while(waitFlag)
        {
            if(sleepCount >= 50)
            {
                return;
            }
            QApplication::instance()->processEvents();
            Sleep(300); //wait untill get mid value of pick in other thread
            ++sleepCount;
        }
        int diff = amplitude - midValue;
        if(diff < 0)
        {
            if(-diff < ACCEPT_DIFF)
            {
                success = true;
                break;
            }
            else
            {
                min = static_cast<unsigned char>(command);
            }
        }
        else
        {
            if(diff < ACCEPT_DIFF)
            {
                success = true;
                break;
            }
            else
            {
                max = static_cast<unsigned char>(command);
            }
        }
    }
    if(success)
    {
        result = static_cast<int>(command);
        return;
    }
}

void Dialog::computeMid(int curVal)
{
    midValue += curVal;
    ++midCount;
    if(midCount >= SIZE_OF_SAMPLE)
    {
        midValue /= midCount;
        waitFlag = false;
    }
}
Dialog::~Dialog()
{
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include "dialog.h"
#include "device.h"
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    QPushButton* btn;
    QTimer timer;
    Dialog* d;
    device* dev;
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void createDialog();
    void handleTimeOut();
    void sendCommand();
};

#endif // MAINWINDOW_H

主窗口.cpp:

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    dev = new device(this);
    btn = new QPushButton();
    this->layout()->addWidget(btn);
    connect(btn,SIGNAL(clicked()),this,SLOT(createDialog()));
    connect(&timer,SIGNAL(timeout()),this,SLOT(handleTimeOut()));
}

void MainWindow::sendCommand()
{
    timer.start(5000);
}
void MainWindow::createDialog()
{
    d = new Dialog();
    connect(d,SIGNAL(sendCommand()),this,SLOT(sendCommand()));
    connect(dev,SIGNAL(takeMidVal(int)),d,SLOT(computeMid(int)));
    connect(d,SIGNAL(setBinToSeek(int)),dev,SLOT(seek(int)));
    d->exec();
}
void MainWindow::handleTimeOut()
{
    d->configRes = MK_CORRECT_RESPONSE;
}
MainWindow::~MainWindow()
{
}

主文件

#include <QApplication>
#include <QtCore>
#include <QtGui>
#include "mainwindow.h"
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

示例项目本身
当我发送信号时,调用了 sendCommand 插槽,这没有问题。但是从槽返回后,当定时器到期时,处理程序不会被调用。计时器完成后如何跳转到处理程序?

如果我们从一个抽象的例子转移到一个真实的例子,那么会发生以下情况:从主窗口调用一个模式。在模态窗口执行代码期间,会向主机发送信号,以通过 COM 端口向设备发送命令。此外,有必要从设备接收响应并处理它的缺失或不正确。为此,使用了计时器。
据我了解,发出信号后,模态窗口代码的执行一刻也没有停过,于是我就把它无限循环,直到flag落下,表示所​​有处理完成。
但问题是定时器并没有以任何方式触发handler调用,退出slot后什么也没有发生,模态窗口代码的执行就陷入了死循环。

已添加以下内容。通过调用handleClick,生成一个命令,发送到device1,影响device2的输出。之后,向 device2 发送一个信号,以便它开始返回某个值。当收集到足够数量的这些值时,会计算它们的算术平均值,并估计接收到的值与期望值之间的差异。如果差值大于最小值,则球队的阵型会有调整,一切都重新开始。

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Chernin
    2020-12-12T21:09:56Z2020-12-12T21:09:56Z

    你当然可以关注

    while(flag) {
       QApplication::instance()->processEvents();
    }
    

    但是,一般来说,应该删除这个循环,根本不需要它。据我了解,某处的 com 端口应该有一些东西,所以如果答案来了,发出一个确认已经到来的信号,如果没有,则触发响应等待计时器,表明什么都没有到来。在这两种情况下,都会发生某些事情并且直接关闭(或不关闭)对话框,也就是说,以通常的方式,而不是通过标志。

    例如,您需要在对话框中告知信号已超时。我们这样做:

    d = new Dialog();
    connect(d,SIGNAL(sendCommand()),this,SLOT(sendCommand()));
    
    connect(&timer,SIGNAL(timeout()),d,SLOT(fail())); 
    
    d->exec();
    

    如果我们收到来自 com 端口的响应,那么我们只是停止计时器并且不接收任何文件。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5