Как и обещал - сегодня мы поговорим об улучшении (доработке) нашего эльфа.
Важно! Чтобы было понятно о чем идет речь в этом уроке - смотрим тутУрок - Создание/редактирование простого эльфа (подробно).
Добавим код, который отключит возможность запуска нескольких копий эльфа (если, к примеру, по ошибке пару раз запустить эльф, нажав на него - Hello_World_main.elf, то в Букменеджере мы увидим:
Запуск нескольких копий эльфа ни к чему хорошему не приводит (Heap используется зря - в лучшем случае).
BOOK * CreateHWBook() { HWBook= new BOOK; CreateBook(HWBook,onCloseHWBook,&base_page,"HelloWorld",-1,0); return(HWBook); }
int main (void) { CreateHWBook(); // выводим текст в "заметки" на StandBy StatusIndication_ShowNotes(STR("Я написал эльф! Ура!")); // запускаем таймер на 0.5 сек. timer=Timer_Set(500,onTimer,0); return(0); }
2) Добавляем следующий код, который отвечает за защиту от запуска нескольких копий эльфа:
int myFind(BOOK* book) { if(!strcmp(book->xbook->name,"HelloWorld")) return(1); return(0); }
int main (void) { if (FindBook(myFind)) { MessageBox(0x6fFFFFFF,STR("уже запущен"),0, 1 ,5000,0); SUBPROC(elf_exit); } else { CreateHWBook(); StatusIndication_ShowNotes(STR("Я написал эльф! Ура!")); return(0); } }
Что важно знать при добавлении этого кода?
а) Функция
int myFind(BOOK* book) { if(!strcmp(book->xbook->name,"HelloWorld")) return(1); return(0); }
отвечает за поиск в памяти телефона книги (book) с названием HelloWorld, т.е. ищет запущен ли наш эльф или нет.
б) name,"HelloWorld" должно совпадать с названием нашего эльфа, т.е. с названием эльфа в строке - CreateBook(HWBook,onCloseHWBook,&base_page,"HelloWorld",-1,0);
в) Если имена не будут совпадать - функция int myFind(BOOK* book) не найдет запущен ли наш эльф в памяти (т.к. имя не совпадает) и не произойдет следующее:
if (FindBook(myFind)) { MessageBox(0x6fFFFFFF,STR("уже запущен"),0, 1 ,5000,0); SUBPROC(elf_exit);
- не появится сообщение на экране "уже запущен" (за вывод сообщения на экран отвечает функция MessageBox(0x6fFFFFFF,STR("уже запущен"),0, 1 ,5000,0);) и не произойдет выгрузка ("убийство") эльфа (функция - SUBPROC(elf_exit);).
Т.е. если имя в этой строке if(!strcmp(book->xbook->name,"HelloWorld")) return(1); не совпадет с именем в этой строке CreateBook(HWBook,onCloseHWBook,&base_page,"HelloWorld",-1,0); мы сможем запустить наш эльф несколько раз -
А мы этого не хотим
г) В строке MessageBox(0x6fFFFFFF,STR("уже запущен"),0, 1 ,5000,0); - мы можем менять сообщение "уже запущен" на любое другое. Например, на такое: HelloWorld is running... -
MessageBox(0x6fFFFFFF,STR("HelloWorld is running..."),0, 1 ,5000,0);
BOOK * CreateHWBook() { HWBook= new BOOK; CreateBook(HWBook,onCloseHWBook,&base_page,"HelloWorld",-1,0); return(HWBook); }
int myFind(BOOK* book) { if(!strcmp(book->xbook->name,"HelloWorld")) return(1); return(0); }
int main (void) { if (FindBook(myFind)) { MessageBox(0x6fFFFFFF,STR("HelloWorld is running..."),0, 1 ,5000,0); SUBPROC(elf_exit); } else { CreateHWBook(); StatusIndication_ShowNotes(STR("Я написал эльф! Ура!")); timer=Timer_Set(500,onTimer,0); return(0); } }
4) При попытке повторного запуска эльфа на экране телефона мы видим следующее сообщение:
5) В Букменеджере запущен только один эльф (больше нет возможности запустить эльф HelloWorld несколько раз):
PS: В следующем уроке будем создавать выполнение действия эльфом ("запуск" эльфа) на нажатие кнопки.
Вы не можете начинать темы. Вы не можете редактировать свои сообщения. Вы не можете создавать опросы. Вы не можете вкладывать файлы в сообщения. Вы не можете отвечать на сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать.