Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
pominub
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 30
#1

Запустить несколько таймеров одновременно - C++

19.03.2011, 05:20. Просмотров 1231. Ответов 6
Метки нет (Все метки)

Здравствуйте.
Мне надо сделать чтобы несколько таймеров работало одновременно.
Допустим пусть будет два таймера. Один просто добавляет строку в первый ListBox, вругой во второй.
Запускаются они с разных кнопок.
Я делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CMytimeDlg::OnTimer( UINT nIDEven)
{
    m_List1.Addstring('string1');
}
 
void CMytimeDlg::OnButton1() 
{
    
   SetTimer(ID_TIMER_1, 1500, NULL); 
 }
 
void CALLBACK EXPORT OnTimer1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
 
{   
    CMytimeDlg* dlg;
    dlg->m_List2.AddString('string2')
}
void CMytimeDlg::OnButton3() 
{
      SetTimer(ID_TIMER_2,1500,OnTimer1); 
}
Компилируется всё нормально. А при запуске второго таймера
выскакивает ошибка. Что я делаю не правильно?
Как надо сделать?
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
20.03.2011, 13:53     Запустить несколько таймеров одновременно #2
Ты перепутал определения обработчика тамера в API и в MFC!!!!
это определение в API:
C++
1
void CALLBACK EXPORT OnTimer1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
это определение в MFC и оно скорочено так как MFC сам заполняет необходимые поля см. выше:
C++
1
void CMytimeDlg::OnTimer( UINT nIDEven)
Исходя из выше.... есть две функции SetTimer одна реализована в API другая в MFC.

Удачи
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
20.03.2011, 17:00     Запустить несколько таймеров одновременно #3
Ошибка выскакивает потому,что
объявленна ссылка:
C++
1
 CMytimeDlg* dlg;
она на данный момент пуска и мозги под CMytimeDlg не зарезервированы,
из-зи этого нелбьзя юзить dlg->m_List2.AddString('string2');

Чтоб работало могу предложить следующее:
Вместо
C++
1
CMytimeDlg* dlg;dlg->m_List2.AddString('string2');
Написать
C++
1
2
3
4
ListBox_AddString(GetDlgItem(hWnd,IDC_LIST1),'string2');
/*
IDC_LIST1 - Id листбокса в ресурсах
*/
pominub
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 30
21.03.2011, 00:02  [ТС]     Запустить несколько таймеров одновременно #4
2Kovalsky2

Спасибо. Ясно.
Только добавление строк в ListBox`ы я привёл в качестве примера.
На самом деле программа должна выполнять другие, более сложный вещи.
Как ещё , в принципе можно организовать параллельную независимую
работу нескольких таймеров?
pominub
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 30
21.03.2011, 00:13  [ТС]     Запустить несколько таймеров одновременно #5
2DmSK

Если в эту функцию(void CALLBACK EXPORT OnTimer1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)) вставить просто
AfxMessageBox ('что-нибудь'), то всё работает.
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
21.03.2011, 15:17     Запустить несколько таймеров одновременно #6
2pominub
Вроде с таймерами всё,две методы разобрали.
Можно еще сделать так чтобы функция
void CALLBACK EXPORT OnTimer1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
входила в состав класса CMytimeDlg,затем ещё пару строчек для того чтоб не возиться со
ststic переменными и функциями класса.
Я Вам в декабре отправлял письмо на e-mail про тимеры,тока не помню что я там писал.

Если у Вас действительно более сложные задачи и таймеры не устраивают,а надо параллельно
выполнять вычисления,то может поглядывать в сторону параллельных потоков (CreateThread(...)).

P.S.
Ну,а то что в MFС использовать API функции и методы - ни кто не запрещал.
Всетаки сначала появился API,а потом уже MFC.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2011, 00:23     Запустить несколько таймеров одновременно
Еще ссылки по теме:

C++ Два таймера одновременно
Можно ли одновременно изучать С и С++? C++
C++ Корректная эмуляция таймеров
__cplusplus и __STDC__ одновременно? C++
C++ Записать в файл несколько строк, а затем записать несколько строк из этого файла в другой

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
pominub
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 30
22.03.2011, 00:23  [ТС]     Запустить несколько таймеров одновременно #7
Спасибо.
С параллельной работой таймеров вроде разобрался. Сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void CMytimeDlg::OnTimer(UINT nIDEvent) 
{ 
    switch(nIDEvent) 
    { 
          case ID_TIMER_1: 
                m_List1.Addstring('string1'); 
                break; 
          case ID_TIMER_2: 
                m_List2.Addstring('string2'); 
                break; 
    } 
} 
 
void CMytimeDlg::OnButton1() 
{ 
    SetTimer(ID_TIMER_1, 1500, NULL); 
} 
 
void CMytimeDlg::OnButton2() 
{ 
    SetTimer(ID_TIMER_2, 1500, NULL); 
}
Ну а поскольку процессы происходят достаточно ресурсоёмкие, то
какждый таймер я 'засунул' в отдельный поток
C++
1
2
3
4
5
6
7
8
unsigned __stdcall potok1(void *p) {}
_beginthreadex( 
       NULL, 
       0, 
       potok1, 
       (void *)this, 
       0, 
       &thd_id);
Вроде работает...
На данном этапе меня это устраивает.
Если возникнут ещё какие-либо вопросы, обращусь за помощью
Yandex
Объявления
22.03.2011, 00:23     Запустить несколько таймеров одновременно
Ответ Создать тему
Опции темы

Текущее время: 15:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru