Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Таймер в консольном приложении. Базы данных.

Автор: smirnoffx 10.5.2011, 20:44

Доброго всем времени суток.

Есть задача реализовать выгрузку неких данных в БД MSSQL по определенному интервалу. Реализация должна без проблем запускаться в linux и windows.

Для этого дабы не писать gui хочу реализовать консольное приложение.
Встал вопрос как реализовать таймер и функцию-обработчик события?

QTimer::singleShot(2000, &a, SLOT(f()));
не катит. Пишет что
No such slot QCoreApplication::f() in ...

Необходимо реализовать класс унаследованный от QCoreApplication в котором определить слот и таймер?

Как реализовать таймер?

Автор: Алексей1153 10.5.2011, 20:57

один из вариантов - QThread . В потоке делать задержки нужного интервала и вызывать нужные функции.

у QThread есть таймеры с разной точностью

void QThread::usleep ( unsigned long usecs ) [static protected]
void QThread::msleep ( unsigned long msecs ) [static protected]
void QThread::sleep ( unsigned long secs ) [static protected]

Если не запускать новый поток, то воспользоваться напрямую помешают модификаторы protected, поэтому произведи свой класс и оттуда сделай public транплин

Автор: smirnoffx 10.5.2011, 21:12

А почему так не работает:

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <iostream>

class tmr
{

public:
   void shot()
   {
      QTimer::singleShot(2000, , SLOT(f()));
   }

public slots:
   void f();

};


void tmr::f()
{
  std::cout << "display test string";
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    tmr s;
    s.shot();

    return a.exec();
}


Не может к слоту подсоединиться...

Автор: MoPDoBoPoT 10.5.2011, 21:56

1. Для использования сигнал-слотов необходимо наследоваться от QObject, а также нужен макрос Q_OBJECT
2. Привыкай сразу для классов собственные .cpp и .h файлы создавать

Автор: smirnoffx 10.5.2011, 22:25

Цитата(MoPDoBoPoT @ 10.5.2011, 22:56) *
1. Для использования сигнал-слотов необходимо наследоваться от QObject, а также нужен макрос Q_OBJECT
2. Привыкай сразу для классов собственные .cpp и .h файлы создавать

Вот так все работает:
#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QObject>
#include <iostream>

class Tmr : public QObject
{
  Q_OBJECT
public:
  Tmr()
  {
      QTimer::singleShot(2000, this, SLOT(shot()));
  }

public slots:
  void shot();
};

void Tmr::shot()
{
 std::cout << "display test string";
}

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   //Tmr s;
   //s.shot();

   return a.exec();
}


Но стоит в main создать объект класса
Tmr s;
s.shot();


как летят ошибки:
Цитата
D:/modul/modul-build-desktop/debug/main.o:-1: In function `Tmr':
D:\modul\modul-build-desktop/../modul/main.cpp:11: ошибка: undefined reference to `vtable for Tmr'
D:/modul/modul-build-desktop/debug/main.o:-1: In function `~Tmr':
D:\modul\modul-build-desktop/../modul/main.cpp:7: ошибка: undefined reference to `vtable for Tmr'
:-1: ошибка: collect2: ld returned 1 exit status


В чем проблема?


Автор: Алексей1153 10.5.2011, 22:44

smirnoffx,

Цитата(MoPDoBoPoT @ 11.5.2011, 0:56) *
2. Привыкай сразу для классов собственные .cpp и .h файлы создавать


выполни данную рекомендацию :)

Автор: smirnoffx 11.5.2011, 16:05

Всем спасибо. Заработало так:

main.cpp:

#include <QtCore/QCoreApplication>
#include <modul.h>

#include <iostream>

void Tmr::shot()
{
 std::cout << "display test string";
}

void Tmr::atimer(int msec)
{
   QTimer::singleShot(msec, this, SLOT(shot()));
}

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   Tmr tobj;
   tobj.atimer(10000);

   return a.exec();
}


modul.h:
#include <QtCore/QCoreApplication>
#include <modul.h>

#include <iostream>

void Tmr::shot()
{
 std::cout << "display test string";
}

void Tmr::atimer(int msec)
{
   QTimer::singleShot(msec, this, SLOT(shot()));
}

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   Tmr tobj;
   tobj.atimer(10000);

   return a.exec();
}


Думаю у меня скоро еще возникнут вопросы )))

Точнее так (прошу прощения за *.h файл):

main.cpp:
#include <QtCore/QCoreApplication>
#include <modul.h>

#include <iostream>

void Tmr::shot()
{
 std::cout << "display test string";
}

void Tmr::atimer(int msec)
{
   QTimer::singleShot(msec, this, SLOT(shot()));
}

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   Tmr tobj;
   tobj.atimer(10000);

   return a.exec();
}


modul.h:
#ifndef MODUL_H
#define MODUL_H

#include <QObject>
#include <QTimer>

class Tmr : public QObject
{
   Q_OBJECT
public:
   Tmr()
   {
   }

public slots:
   void shot();
   void atimer(int msec);
};

#endif // MODUL_H


Думаю у меня скоро еще возникнут вопросы )))

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)