Урок - Оптимизация кода эльфа : Эльфостроение : Форум


 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); мы сможем запустить наш эльф несколько раз -



А мы этого не хотим :oops:

г) В строке 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: В следующем уроке будем создавать выполнение действия эльфом ("запуск" эльфа) на нажатие кнопки.

Прикрепленный к сообщению файл:

Urok_2.zip Urok_2.zip (494.45 kb; 32 hits) Скачать файл

 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