Ir para conteúdo
Fórum Script Brasil
  • 0

Delegates e property não estatica como parametro


fabioravila

Pergunta

Fala pessoal, vamos ao problema

Estou desenvolvendo (adaptando) uma classe de interface para reconhecimento de fala em C++/CLI, interface pois toda a logica de reconhecimetno é realizada por uma outra biblioteca chamada Julius http://julius.sourceforge.jp/en_index.php?q=index-en.html

Atraves de sua propria API que disponibiliza várias funcionalidade que estou utilizando para criar minha classe.

Uma das partes da API são as funções de callback, onde posso adicionar funções para serem executadas pela engine da API e certos momentos.

Minha classe disponibiliza alguns eventos, alguns desses eventos são dependentes da execução de um callback pela API.

Abaixo coloco o codigo apenas com poucos métodos para exemplificar meu problema

Header

#ifndef FALAENGINE_H_
#define FALAENGINE_H_

#pragma once


extern "C"{
#include <julius/julius.h>
}

namespace FalaAPI {
    
    public ref class FalaEngine
    {
    public:

        //// Construtor padrão
        FalaEngine();

        ////// Destutor Padrão
        ~FalaEngine();

        // Eventos
        ////////// Evento executado quando o processo de reconhecimento termina, retornando um recresult
        delegate void OnRecognizedDele(FalaAPI::RecoResult^ result);
        static property OnRecognizedDele^ OnRecognized;

        //// Eventos de Engine
        //////// Evento de delegate chamado quando a engine é iniciada CALLBACK_EVENT_PROCESS_ONLINE 
        delegate void OnEngineStartDele();
        property OnEngineStartDele^ OnEngineStart;

    private:
        //Atributos objetos e handlers
        Recog *recog;
        Jconf *jconf;
    };
}

#endif /* FALAENGINE_H_*/
Source
#include "stdafx.h"

using System::String;
using System::Console;

#include "FalaEngine.h"
#include <windows.h>



namespace FalaAPI{

    //Sub função qeu invoça o evento OnENgineStart
    void StartOnEngineStart()(Recog *recog, void * dummy){
    
        if(FalaEngine::OnEngineStart->GetInvocationList()->Length > 0)
            FalaEngine::OnEngineStart->Invoke();
    }


    //Sub função qeu invoça o evento OnRecognized
    void StartOnRecognized()(Recog *recog, void * dummy){

        if(FalaEngine::OnRecognized->GetInvocationList()->Length > 0)
            FalaEngine::OnRecognized->Invoke();
    }


    //Contrutor Padrão    (Aloca memoria, inicia os componentes e callback)
    FalaEngine::FalaEngine(){
        recog = j_recog_new();
        jconf = j_jconf_new();
                
        //Atribuição de callback
        callback_add(recog, CALLBACK_EVENT_PROCESS_ONLINE, StartOnEngineStart, NULL);
    
        callback_add(recog, CALLBACK_RESULT, StartOnRecognized, NULL);

    }

}

Bom eu utilizo a função callback_add da API Julius, que possui a seguinte assinatura

int callback_add (Recog *recog, int code, void(*func)(Recog *recog, void *data), void *data)

Como podem ver eu tenho um evento(property) statico e outro não statico.

Tenho uma função intermediaria para cada evento, e esta função e a referenciada no callback_add, fica responsável pro realizar algum processamento no objeto passado e efeutar o Invoke no evento.

O evento statico funciona perfeitamente. Porém o evento não statico eu não consigo fazer fucionar, na verdade nem compila.

Da forma como está o codigo passado que no interior da função intermerdiaria (StartOnEngineStart), ela não reconhece o metodo como evento válido dando o erro:

error C2227: left of '->GetInvocationList' must point to class/struct/union/generic type

Já tentei várias coisas, primeiro colocar a função intermediaria como membro private da classe, mas ao fazer isso esta não consegue ser passada como parametro no call_back add, retornando o seguinte:

error C3867: 'FalaAPI::FalaEngine::StartOnEngineStart': function call missing argument list; use '&FalaAPI::FalaEngine::StartOnEngineStart' to create a pointer to member

Fiz outras tentativas desesperadas, porém só pioraram a situação.

Já procurei no forum, li varias documentações mas estou muito enferrujado em C/C++, pois hoje trabalho com C# e outras linguagens.

Se alguém pudessem me ajudar a solucionar este problema eu agradeço.

Tambem agradeço desde já qualquer ajuda.

Editado por fabioravila
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...