静态函数和信号槽

来源:互联网 发布:韩后 知乎 编辑:程序博客网 时间:2024/05/23 14:57
class PlcManager: public QObject{    Q_OBJECTsignals:    void toMainThread( int iEvent );public slots:    void recvToMainThread( int iEvent );public:    PlcManager();    void sdk_init();    int postMessageCommand( char *cCommand, char *cParam, int iParamLength );    void doDealMessage(); //in main threadpublic:    static void fn_message_command( char *cCommand, char *cParam, int iParamLength ); //use in dll-sdk, in sub thread for receivepublic:    static PlcManager *m_pManager;};PlcManager *PlcManager::m_pManager = NULL;int PlcManager::postMessageCommand( char *cCommand, char *cParam, int iParamLength ){    //first save Command and Paramater to a global variable, then    emit this->toMainThread( MyEvent_Message );}void PlcManager::recvToMainThread( int iEvent ){    doDealMessage(); //可重入}void PlcManager::doDealMessage(){    //cmd from a global variable    //do business}void PlcManager::fn_message_command( char *cCommand, char *cParam, int iParamLength ) //不可重入{    m_pManager->postMessageCommand( cCommand, cParam, iParamLength );}void PlcManager::sdk_init(){    if( m_pManager == NULL )    {        m_pManager = new PlcManager();        connect( m_pManager, SIGNAL(toMainThread(int)), m_pManager, SLOT(recvToMainThread(int)) );    }    register_message_command_notify( fn_message_command ); //注册回调函数}PlcManager::PlcManager(){    m_pManager = new PlcManager(); //X    connect( m_pManager, SIGNAL(toMainThread(int)), m_pManager, SLOT(recvToMainThread(int)) ); //X    //永远不要在构造函数初始化:这样会造成死循环!!}typedef void ( __cdecl *fn_message_command_type)( char *cCommand, char *cParam, int iParamLength );__declspec(dllimport) int __cdecl register_message_command_notify( fn_message_command_type fn );

0 0