Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу создать TTimer без компоненты на форме 
:(
    Опции темы
Liner
Дата 11.4.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

Репутация: нет
Всего: нет



Если просто выбрать компоненту Timer и поместить ее на форме, то все нормально работает (для начала хотя бы раз в секунду выводить чего-нибудь в Memo). А если перенести TTimer *Timer1 из __published в private, то "волшебная" функция TForm1::Timer1Timer уже не работает. Смутно подозреваю, в чем дело (// IDE-managed Components), но только смутно.
Как мне сделать свою функцию обработки события TTimer'a?
ЗЫ. В итоге вместо TForm1 будет свой класс, на который "часики" из компонет не перетащить.
PM MAIL   Вверх
vivat
Дата 12.4.2006, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 6.4.2006
Где: Томск

Репутация: 2
Всего: 2



unit1.h
Код

class TForm1 : public TForm
{
__published:    // IDE-managed Components
  TLabel *Label1;
private:    // User declarations
  TTimer *myTimer;
  void __fastcall myTimer1Timer(TObject *Sender);
public:        // User declarations
  __fastcall TForm1(TComponent* Owner);
};

unit1.cpp
Код

TForm1 *Form1;
int tik=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  myTimer = new TTimer(this);
  myTimer->OnTimer = myTimer1Timer;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::myTimer1Timer(TObject *Sender)
{
  Label1->Caption=AnsiString(++tik);
}

PM   Вверх
Liner
Дата 12.4.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

Репутация: нет
Всего: нет



Спасибо, но это масло масляное, мне-то нужно без формы, например, в консольном приложении:
Код

TTimer* myTimer;

void myFunc()
{
  printf("111");
}

int main (/*...*/)
{
  myTimer = new TTimer;
  myTimer->OnTimer = myFunc; // требует какой-то бред :) типа __closure, TNotifyEvent, ...

  // ...

  delete myTimer;
}

PM MAIL   Вверх
_hunter
Дата 12.4.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



myFunc д.б. членом класса.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
pandrew
Дата 12.4.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 27.3.2006

Репутация: 3
Всего: 3



Цитата(Liner @ 12.4.2006, 12:14)
Спасибо, но это масло масляное, мне-то нужно без формы, например, в консольном приложении:
Создать таймер руками для любого производного класса от TWinControl можно например так.
Код


class MyConrol : protected TWinControl
{
private:    
   TTimer  *timer;
   void __fastcall TimeFunc(TObject *Sender);
public:        // User declarations
    __fastcall MyConrol (TComponent* Owner);
};

__fastcall MyConrol ::MyConrol (TComponent* Owner)  : TWinControl(Owner)
{   timer= new TTimer(this);
     timer->OnTimer=&TimeFunc;
}

А вот без окна не получится. Почитай в хелпе про SetTime(WinAPI), WM_TIMER.. и м.б. вопросы исчезнут.
PM MAIL   Вверх
Liner
Дата 12.4.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

Репутация: нет
Всего: нет



pandrew, на строчку
Код

    __fastcall MyConrol (TComponent* Owner);

ругается, что конфликт с TWinControl. И в TWinControl конструктора вообще нет.

To All:
А через SetTimer, WM_TIMER чего-то еще запутаннее получается. Может, кто сможет быстро набросать простейший примерчик? smile


PM MAIL   Вверх
_hunter
Дата 12.4.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



vcl.h подключен?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ctrl_Alt_Del
Дата 12.4.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 11.3.2006
Где: Ставрополь

Репутация: 2
Всего: 2



Liner,
сначала устанавливаешь таймер
Код

SetTimer(Handle,Id,MSec,NULL);

Id - идентификатор, MSec - количество миллисекунд

Потом ловишь WM_TIMER, в котором свой таймер можешь узнать сравнив идентификатор с wParam.
Собственно все. smile
PM MAIL ICQ   Вверх
Liner
Дата 12.4.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

Репутация: нет
Всего: нет



Чего-то я совсем запутался. Никак не могу понять, что должно происходить? smile smile

В этом коде msg.message никогда не бывает WM_TIMER.

Код

#include <vcl.h>
#pragma hdrstop

#pragma argsused

void myfunc()
{
  int a = 0;
}

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

   HWND Handle;
   UINT Id = 123;
   UINT MSec = 1000;

  SetTimer(Handle,Id,MSec,(TIMERPROC)myfunc);

  MSG msg;

  while (GetMessage(&msg, // message structure
            NULL,           // handle of window to receive the message
            NULL,           // lowest message to examine
            NULL))          // highest message to examine
    {

        // Post WM_TIMER messages to the hwndTimer procedure.

        if (msg.message == WM_TIMER)
        {

            //msg.hwnd = hwndTimer;
            myfunc();
        }

        TranslateMessage(&msg); // translates virtual-key codes
        DispatchMessage(&msg);  // dispatches message to window
    }

  return 0;
}


(написано с помощью help'а и такой-то матери smile )

pandrew написал, что без окна не получится, может в этом дело? Неужели в Windows нельзя создать процесс без визуального оформления, который бы, например, раз в секунду писал в text.txt строчку "text"?!
Как-то же это должно просто делаться, но во всех моих книжках либо через компоненту Timer, что элементарно, либо какое-то жуткое создание новых визуальных компонент.
PM MAIL   Вверх
Ctrl_Alt_Del
Дата 12.4.2006, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 11.3.2006
Где: Ставрополь

Репутация: 2
Всего: 2



Liner, правильно не получается. Сообщения посылаются ОКНУ.
Сделай так:
Код

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
     // твой код
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     SetTimer(NULL, 0, 1000, (TIMERPROC)TimerProc);
}

PM MAIL ICQ   Вверх
Liner
Дата 13.4.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

Репутация: нет
Всего: нет



Вот что удалось в итоге сделать:

Код

#include <vcl.h>

void __stdcall CALLBACK TimerProc2(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
   int a = 1; 
}

int main(int argc, char* argv[])
{
  MSG msg;
  UINT uu = SetTimer(NULL, NULL, 1000, (TIMERPROC)TimerProc2);

  while (GetMessage(&msg, NULL, NULL, NULL))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  return 0;
} 


Но это совершенно не годится, т.к. нужно одновременно еще что-делать, должны работать другие потоки.
Без этого while как-то можно обойтись? Вообще, нужно сделать класс, в котором есть несколько функций, реагирующих на определенные события в очередях (это уже сделано). И вот нужна еще одна функция, которая бы хотя бы просто раз в секунду "сама по себе" вызывалась, не мешая вызываться остальным. Не верю, что это невозможно.
PM MAIL   Вверх
Bima
Дата 8.5.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Вот писал когда то приложения для тестирования таймеров с разными интервалами... можно и приспособить для консольного приложения, главное указать функции где ты обрабатываешь таймеры.
Ничего не зависает и все работает, причем можно параллельно выполнять другие функции программы, так как вызов функции таймера происходят по прерываниям.

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  Timer.rar 3,02 Kb


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
TheOne81
Дата 9.5.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 8.5.2007
Где: Москва

Репутация: нет
Всего: нет



Я бы посоветовал создавать поток, начинающийся, к примеру, со Sleep(время), после чего - собственно обработка события. Общение с главной формой, если таковая есть - через сообщения, если ни формы, ни класса нету (консолька) - то можно аккуратно пользовать глобальные переменные, хоть и не красиво. Однако, если на одну глобальную переменную приходится несколько потоков, то во избежание - придется еще заюзать мьютексы или семафоры.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0754 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.