Как сохранить фоновый код без создания потока? - PullRequest
0 голосов
/ 15 марта 2019
  1. Я пытаюсь создать простой интерфейс с Qt Creator. Фоновый код продолжает печатать флаг int, и когда пользователь нажимает кнопку, флаг меняется, поэтому вывод меняется.

UI, как это:

enter image description here

выводится так: щелкните 《output 1 , ,, затем измените 0 на 1

enter image description here

  1. Как сохранить фоновый код работающим без создания потока в qt creator?

вот код cpp, я не добавил .h файлы: все файлы доступны здесь перейти ко всему коду в github

main.cpp:

    #include "MainWindow.h"
    #include <QApplication>
    #include <iostream>
    #include "deal.h"

    int main(int argc, char *argv[])
    {
      std::cout << argc << " " << argv[0] << std::endl;
    //  getchar();
      QApplication a(argc, argv);

      MainWindow w;
      w.show();


    //  getchar();
      pthread_t tid;   //Not want to create a thread to run this
      pthread_create(&tid, NULL, run, NULL); 
      //pthread_exit(&tid);
      a.exec();
      return 0;
    }

mainwindow.cpp

    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    #include "deal.h"

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
      ui->setupUi(this);
      connect(ui->pbOriginSound, SIGNAL(clicked()), this, SLOT(change2_origin_sound()));
      connect(ui->pbVecSound, SIGNAL(clicked()), this, SLOT(change2_vec_sound()));
      connect(ui->pbVecNrSound, SIGNAL(clicked()), this, SLOT(change2_vec_nr_sound()));
    }

    void MainWindow::change2_origin_sound(){
      iFlag = 0;
      printf("%d", iFlag);
    }

    void MainWindow::change2_vec_sound(){
      iFlag = 1;
      printf("%d", iFlag);
    }

    void MainWindow::change2_vec_nr_sound(){
      iFlag = 2;
      printf("%d", iFlag);
    }

    MainWindow::~MainWindow()
    {
      delete ui;
    }

deal.cpp

    #include "deal.h"
    #include <iostream>
    #include <unistd.h>

    int iFlag;

    void *run(void *arg){

      while(1){
    //        sleep(1);
        printf("%d\n", iFlag);
        printf("%d%d\n", iFlag, iFlag);
      }
    }

1 Ответ

0 голосов
/ 15 марта 2019

Один из распространенных способов - создать слот-метод и QTimer, который будет вызывать этот метод каждые миллисекунды, например,

в MainWindow.h:

#include <QTimer>
#include <QMainWindow>

class MainWindow : public QMainWindow 
{
Q_OBJECT

   [...]

private slots:
   void MySlot();

private:
   QTimer myTimer;
};

в MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    [...]

    connect(&myTimer, SIGNAL(timeout()), this, SLOT(MySlot()));
    myTimer.start(100);   // MySlot() will be called every 100mS
}

void MainWindow::MySlot()
{
    printf("%d\n", iFlag);
}

Обратите внимание, что этот подход предполагает, что MySlot() вернется быстро; если этого не произойдет, ваш графический интерфейс будет зависать до тех пор, пока он не вернется, поскольку MySlot() все еще работает в потоке графического интерфейса и поэтому задерживает обработку других событий графического интерфейса. Поэтому не делайте внутри MySlot() ничего, что занимает много времени, если только вы не хотите жить с не очень отзывчивым графическим интерфейсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...