crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Таймер в консольном приложении. Базы данных.
smirnoffx
  опции профиля:
сообщение 10.5.2011, 20:44
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 6.11.2010
Пользователь №: 2173

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

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

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

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

Как реализовать таймер?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.5.2011, 20:57
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2788
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 190 раз(а)




Репутация:   34  


один из вариантов - 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
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 6.11.2010
Пользователь №: 2173

Спасибо сказали: 0 раз(а)




Репутация:   0  


А почему так не работает:
#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
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


1. Для использования сигнал-слотов необходимо наследоваться от QObject, а также нужен макрос Q_OBJECT
2. Привыкай сразу для классов собственные .cpp и .h файлы создавать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smirnoffx
  опции профиля:
сообщение 10.5.2011, 22:25
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 6.11.2010
Пользователь №: 2173

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2788
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 190 раз(а)




Репутация:   34  


smirnoffx,

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


выполни данную рекомендацию :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smirnoffx
  опции профиля:
сообщение 11.5.2011, 16:05
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 6.11.2010
Пользователь №: 2173

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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


Думаю у меня скоро еще возникнут вопросы )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.10.2017, 19:06