cocos2d уведомление / событие / сообщение из другого потока - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть рабочий поток, выполняющий вычисления в фоновом режиме, и я хочу отправить событие / сообщение для вызова функции обновления, чтобы обновить графику на экране после завершения вычисления рабочего потока.

Как мне это сделать в cocos2d?

Демонстрационный код:

-(void) updateGraphic
{
//this one update all the graphics/sprite
}

//note workerThreadFunc is being used to start a new thread
-(void) workerThreadFunc
{
//...
//...
//finish calculation here
//since it's in a different thread, I cannot call updateGraphic directly here
//So I need a event to notify update Graphic here somehow

}

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Cocos2D вызывает метод -(void) draw {} на всех узлах автоматически в главном потоке. Вам не нужно вызывать этот метод из другого потока, и вы не можете выполнять пользовательское рисование OpenGL вне метода рисования.

Чтобы вызвать метод, который должен быть выполнен в основном потоке, используйте метод executeSelectorOnMainThread .

0 голосов
/ 14 августа 2013

Я добился этого с помощью pthreads, он должен внести некоторые изменения в CCDirector.cpp & CCDirector.h подробности в этой теме.

, чтобы использовать его, мы можемзарегистрируйте handleMessageInUI в потоке пользовательского интерфейса, затем рабочий поток отправит сообщение в поток пользовательского интерфейса, который вызовет handleMessageInUI для рисования пользовательского интерфейса.ниже приведен пример кода:

  1. В потоке пользовательского интерфейса мы можем зарегистрировать обработчик для обработки сообщения в потоке пользовательского интерфейса.

    bool HelloWorldScene :: handleMessageInUIThread (const EXTCCMessage & msg) {
    // реализации
    // возвращают true, если этот обработчик обработал это сообщение,
    // в противном случае возвращается false
    switch (msg.msgId) {
    case 2:
    break;
    default:
    return false;
    }

    return true;
    }

    // зарегистрировать этот обработчик в UI Threader
    CCDirector :: mainLoopHandler () -> registerHandler (this, (EXTCCHandleMessage) & HelloWorldScene :: handleMessageInUIThread);

  2. отправить сообщение потоку пользовательского интерфейса в рабочем потоке

    EXTCCMessage msg;
    msg.msgId = 2;
    msg.msgData1 = NULL;
    // «msg» будет обрабатываться «handleMessageInUIThread» в потоке пользовательского интерфейса
    CCDirector :: mainLoopHandler () -> postMessage (msg);

...