пятница, 22 июля 2011 г.

SetupCallbacks - общие понятия.



По просьбе трудящихся решил написать статью на тему калбеков(подробно разебрем для чего ,как зачем)!

Давайте посмотрим на функцию SetupCallbacks,что же здесь происходит
int SetupCallbacks(void){
Первую строчку надеюсь не надо объяснять!
    int thid = 0;
Ну это тоже не надо
    thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
а вот тут творится ,что-то интересное ,а именно создается новый поток не зависимый от main_thread!Первый аргумент название потока(назывыйте как хотите),второй аргумент это какая функция выполняется потоком(кстати функция должна иметь вид int (SceSize args, void *argp) для того чтобы функция работала), третий - приоритет (меньше – приоритетнее),
четвертый – какой будет изначальный размер стека,пятый-доп опции!
функция вернула нам UID потока или ошибку (если меньше нуля)
    if(thid >= 0)если больше нуля,тогда стартуем поток
    {
        sceKernelStartThread(thid, 0, 0);
    }

Возращаем UID функции CallbackThread
    return thid;
}

Идем дальше,по поводу аргументов этой функции было сказано выше!
int CallbackThread(SceSize args, void *argp)
{
    int cbid;
    Тут хранится ID колбека.
    Создаем колбек(первый аргумент – имя, второй –функция ,которая вызывается как калбек ,аргумент      
    калбека),возвращаем ID.
    cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);       

    До этого момента система не знает что это калбек закрытия,не понятно зачем это надо не видел чтобы         
    еще где-то использовали  sceKernelCreateCallback!
    Вообщем по поводу этой функции все понятно – регистрируем калбек как калбек выхода
    sceKernelRegisterExitCallback(cbid);
    Здесь поток нам больше не нужен.Эта функция обязательна для всех калбеков!
    sceKernelSleepThreadCB();
    Все возвращаем ноль.
    return 0;
}
Так теперь самая легкая функция(должна принимать вот такой вид int(int arg1, int arg2, void *arg))
int exit_callback(int arg1, int arg2, void *common) 
{
Здесь,если мы нажали на кнопочку хоме и нажали да ,то выходим из игры с помощью этой
функции ->   sceKernelExitGame();
Можно по эксперементировать(например убрать эту строку-игра подвиснет на надписи «Пожалуйста подождите…» - рычажок выключение держим секунд 10  для полного выключения)
 Возвращаем ноль.
    return 0;
}
Спасибо за внимание!

Комментариев нет:

Отправить комментарий