Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с несколькими таймерами, подскажите, плиз 
:(
    Опции темы
АлексейМ
  Дата 12.1.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую!
Смотрите, у меня такая вот проблемка. Суть её заключается в том, что по сигналам разных таймеров должны происходить разные события - например, при прошествии одного значения времени (сигнал первого таймера) открывается одно диалоговое окно, а при прошествии другого времени (сигнал второго таймера) - другое окно.
Можно ли вообще такое осуществить с помощью WM_TIMER?
PM MAIL   Вверх
blackofe
Дата 12.1.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



я такое делал с помощью Timer Queue. вот кусок кода:

Код

class COMRun {
public:
    //..
    HANDLE queuetimer;
    HANDLE htimer;
    HANDLE semaphore;
    //..
};

//...

//[[< Init...
        // start a number of separate threads with the queue listeners
        for(long i = 0; i < (long)comruns.size(); ++i)
                _beginthread(StartTimerThread, 0, (void *)i);
//[[>

//...

void CServiceModule::StartTimerThread(void *m)
{
        long i = (long)m;
        try {
                _Module.logger.Write(3, "paramnum[%d]: %d, timerperiod: %d", i,
                                                _Module.comruns[i].paramnum, _Module.comruns[i].timerperiod);
                _Module.comruns[i].semaphore = CreateSemaphore(NULL, 1, 1, _Module.comruns[i].name.c_str());
                _Module.comruns[i].queuetimer = CreateTimerQueue();
                if(CreateTimerQueueTimer(&(_Module.comruns[i].htimer), _Module.comruns[i].queuetimer,
                                                CallCOM, (PVOID)i, 0, _Module.comruns[i].timerperiod*1000, 0))
                        _Module.logger.Write(3, "[%d] queuetimer created", i);
                else
                        _Module.LogEvent(GKCS_TIMERERROR, EVENTLOG_ERROR_TYPE, "Create Timer error");
        } catch(...) {
                _Module.logger.Write(1, "[%d] --- CServiceModule::StartTimerThread | catch(...)", i);
        }
}


маленькое дополнение. Timer Queue требуют win2000 и выше.

Это сообщение отредактировал(а) blackofe - 12.1.2006, 22:57
PM MAIL   Вверх
Fighter
Дата 12.1.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В легкую, вот кусок кода, пример написан с использованием библиотеки MFC:

В исполняемом файле CJimkasView.cpp мы напишем

Код

...
void CJimkasView::OnTimer(UINT nIDEvent) 
{
    switch (nIDEvent) {
    case TIMER1:
        MessageBox("This is Timer1 with 5 seconds interval");
        break;
    case TIMER2:
        MessageBox("This is Timer2 with 17 seconds interval");
        break;
    case TIMER3:
        MessageBox("This is Timer3 with 23 seconds interval");

    default:
        break;
    }

    CScrollView::OnTimer(nIDEvent);
}

int CJimkasView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CScrollView::OnCreate(lpCreateStruct) == -1)
        return -1;
    m_nTimer1 = SetTimer(TIMER1, 5000, NULL); //2 Ñåêóíäû
    m_nTimer2 = SetTimer(TIMER2, 17000, NULL); //5 ñåêóíäû
    m_nTimer3 = SetTimer(TIMER3, 23000, NULL); //11 ñåêóíä

    return 0;
}
...


а в заголовочном файле CJimkasView мы напишем

Код

// JimkasView.h : interface of the CJimkasView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_JIMKASVIEW_H__D926D958_54F5_4451_8AF5_82C71587E7DD__INCLUDED_)
#define AFX_JIMKASVIEW_H__D926D958_54F5_4451_8AF5_82C71587E7DD__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define TIMER1 100
#define TIMER2 101
#define TIMER3 102

class CJimkasView : public CScrollView
{
protected: // create from serialization only
    CJimkasView();
    DECLARE_DYNCREATE(CJimkasView)

// Attributes
public:
    CJimkasDoc* GetDocument();

// Operations
public:
    int m_nTimer1, m_nTimer2, m_nTimer3;

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CJimkasView)
    public:
    virtual void OnDraw(CDC* pDC);  // overridden to draw this view
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    virtual void OnInitialUpdate(); // called first time after construct
    virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CJimkasView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
    //{{AFX_MSG(CJimkasView)
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG  // debug version in JimkasView.cpp
inline CJimkasDoc* CJimkasView::GetDocument()
   { return (CJimkasDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_JIMKASVIEW_H__D926D958_54F5_4451_8AF5_82C71587E7DD__INCLUDED_)



Вот и вся работа.
PM MAIL   Вверх
АлексейМ
Дата 12.1.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!!! smile
Ща буду разбираться...

Это сообщение отредактировал(а) АлексейМ - 12.1.2006, 23:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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