Урок - Оптимизация кода эльфа : Эльфостроение : Форум |
vodoo999: |
07.11.09, 22:13 |
Как и обещал - сегодня мы поговорим об улучшении (доработке) нашего эльфа. Важно! Чтобы было понятно о чем идет речь в этом уроке - смотрим тут Урок - Создание/редактирование простого эльфа (подробно). Добавим код, который отключит возможность запуска нескольких копий эльфа (если, к примеру, по ошибке пару раз запустить эльф, нажав на него - Hello_World_main.elf, то в Букменеджере мы увидим: Запуск нескольких копий эльфа ни к чему хорошему не приводит (Heap используется зря - в лучшем случае). И так начнем 1) Нам потребуется код нашего эльфа: Жми сюда: 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); Было: Стало: 3) Получаем в итоге следующий код: Жми сюда: 4) При попытке повторного запуска эльфа на экране телефона мы видим следующее сообщение: 5) В Букменеджере запущен только один эльф (больше нет возможности запустить эльф HelloWorld несколько раз): PS: В следующем уроке будем создавать выполнение действия эльфом ("запуск" эльфа) на нажатие кнопки. |
den_po: |
08.11.09, 01:04 |
эмм... а где оптимизация? а для поиска книги по имени гораздо лучше использовать FindBookEx Код: int cmp_proc(BOOK* book,int* param) { if(!strcmp(book->xbook->name, (char*)param)) return 1; return 0; } ... BOOK* bk = FindBookEx(cmp_proc, (int*)"имякниги"); это будет особо заметно, если придётся искать несколько разных книг |
URL этой темы: https://mobilefree.justdanpo.ru/newbb_plus/viewtopic.php?topic_id=4454 © 2005-2018 supertrubka.org |