|
Can't start multiple timers |
DragonSpace23
Member #16,945
January 2019
|
Hi Sorry if my inglesh is bad |
Audric
Member #907
January 2001
|
It's difficult to say without seeing your code that declares / sets up / starts these timers. |
DragonSpace23
Member #16,945
January 2019
|
I use 2 different event queues, one for timer. 1bool INTERFACE::init(ALLEGRO_DISPLAY* display) {
2 if (int_queue) {
3 queue = al_create_event_queue();
4
5 al_register_event_source(queue, al_get_keyboard_event_source());
6 al_register_event_source(queue, al_get_display_event_source(display));
7 }
8
9 grp.queue = al_create_event_queue();
10 grp.timer = al_create_timer(1 / setting[SETTING_FPS]);
11 if (!grp.timer) printf("Failed creating timer");
12 timer = al_create_timer(1 / setting[SETTING_TPS]);
13 if (!timer) printf("Failed creating gtimer");
14
15 al_register_event_source(grp.queue, al_get_timer_event_source(grp.timer));
16 al_register_event_source(queue, al_get_timer_event_source(timer));
17
18 called_init = true;
19 return 0;
20}
1int INTERFACE::is_running() {
2 int rvalue = 0;
3
4 if (al_get_timer_started(timer))
5 rvalue += 1;
6 if (al_get_timer_started(grp.timer))
7 rvalue += 2;
8
9 return rvalue;
10}
I use this function to check if the timers has started and it returns 3 every time |
Edgar Reynaldo
Major Reynaldo
May 2007
|
Edit you posted right before I did. Reading your code now. Edit2 My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Audric
Member #907
January 2001
|
1 / setting[SETTING_FPS] setting[] is hopefully an array of floats/doubles. If it's an array of integers, the division will be integer division, where 1 / 60 is 0. One way to foolproof such code is to write "1.0 / x", so that no matter the type of x, it gets 'promoted' to double in order to perform the division. |
DragonSpace23
Member #16,945
January 2019
|
The problem is that only the first I start work. If I print their count the first counts right, but the second stays at zero. I tried starting gps.timer before timer and gps.timer work while timer don't. Event check actualy work. |
DragonSpace23
Member #16,945
January 2019
|
I changed check_event to get timers count 1int main(int argc, char **argv) {
2 al_init();
3 al_install_keyboard();
4
5 ALLEGRO_EVENT event;
6 ALLEGRO_DISPLAY* display = al_create_display(1280, 720);
7
8 INTERFACE interface;
9 interface.set_event(&event);
10 interface.init(display);
11
12 unsigned char key[ALLEGRO_KEY_MAX];
13 memset(key, 0, sizeof(key));
14
15 unsigned char op1 = 0;
16
17 interface.start();
18 while (true) {
19 int64_t timer_count, gtimer_count;
20 op1 = interface.check_event(&timer_count, >imer_count);
21 system("cls");
22 switch (interface.is_running()) {
23 case 0:
24 printf("No timer running\n");
25 break;
26 case 1:
27 printf("Timer running\n");
28 break;
29 case 2:
30 printf("GTimer running\n");
31 break;
32 case 3:
33 printf("Both timer running\n");
34 break;
35 }
36 printf("Timer count: %d\nGTimer count: %d\n", timer_count, gtimer_count);
37
38 op1 = 0;
39 }
40
41 getchar();
42 return 0;
43}
1bool INTERFACE::init(ALLEGRO_DISPLAY* display) {
2 if (int_queue) {
3 queue = al_create_event_queue();
4
5 al_register_event_source(queue, al_get_keyboard_event_source());
6 al_register_event_source(queue, al_get_display_event_source(display));
7 }
8
9 grp.queue = al_create_event_queue();
10 grp.timer = al_create_timer(1 / setting[SETTING_FPS]);
11 if (!grp.timer) printf("Failed creating timer");
12 timer = al_create_timer(1 / setting[SETTING_TPS]);
13 if (!timer) printf("Failed creating gtimer");
14
15 al_register_event_source(grp.queue, al_get_timer_event_source(grp.timer));
16 al_register_event_source(queue, al_get_timer_event_source(timer));
17
18 called_init = true;
19 return 0;
20}
21
22bool INTERFACE::is_init() {
23 return called_init;
24}
25
26void INTERFACE::start() {
27 al_start_timer(timer);
28 al_start_timer(grp.timer);
29}
30
31int INTERFACE::is_running() {
32 int rvalue = 0;
33
34 if (al_get_timer_started(timer))
35 rvalue += 1;
36 if (al_get_timer_started(grp.timer))
37 rvalue += 2;
38
39 return rvalue;
40}
41
42void INTERFACE::stop() {
43 al_stop_timer(timer);
44 al_stop_timer(grp.timer);
45
46}
47
48unsigned char INTERFACE::check_event(/*int input, unsigned char key[]*/int64_t *timer_count, int64_t *gtimer_count) {
49 unsigned char rvalue = 0;
50
51 *timer_count = al_get_timer_count(timer);
52 *gtimer_count = al_get_timer_count(grp.timer);
53
54return rvalue;
55}
Enough? |
Edgar Reynaldo
Major Reynaldo
May 2007
|
DragonSpace23 said: Both of those variables were declared as int64_t, but you're designating themas %d, which is a signed integer. Your displayed counts will likely be wrong. You need to use %llu instead. See printf reference for details. Also, you didn't show us where your settings are declared and defined. As Audric said earlier, if settings[SETTINGS_TPS] or settings[SETTINGS_FPS] are integers , then your division will result in zero being passed to al_create_timer. He did say to change your code to use 1.0 divided by settings[SETTINGS...] but I see you haven't. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
DragonSpace23
Member #16,945
January 2019
|
I changed type of setting from int to float and now %d with %llu I define setting in the constructor of INTERFACE 1INTERFACE::INTERFACE() {
2 int_queue = true;
3 called_init = false;
4
5 setting[SETTING_FPS] = 30;
6 setting[SETTING_TPS] = 100;
7}
Now both of the counts are increasing. |
|