Извлечение 2 указателей, введенных в (void *) - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь передать 2 указателя в качестве аргумента для другой функции, типизированной в (void *) Как мне разделить эти два в последней функции?

Пример:

  class Backgrounder{
        public:
            MESSAGE_QUEUE* m_pMsgQueue;
            LockSection* m_pLc;
            static void __cdecl Run( void* args){

                MESSAGE_QUEUE* s_pMsgQueue = (MESSAGE_QUEUE*)args[0]; // doesn't work
                LockSection* s_pLc = (LockSection*)args[1]; // doesn't work

            }
            Backgrounder(MESSAGE_QUEUE* pMsgQueue,LockSection* pLc) { 
                m_pMsgQueue = pMsgQueue; 
                m_pLc = pLc;
                 _beginthread(Run,0,(void*)(m_pMsgQueue,m_pLc)); 
            }
            ~Backgrounder(){ }
        };

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

Вы должны создать struct с этими двумя типами указателей в качестве членов и передать указатель на это.

2 голосов
/ 07 октября 2011

Выражение (m_pMsgQueue,m_pLc) не делает то, что вы думаете;он вызывает оператор запятой, который просто оценивает второй аргумент.

Объединяет аргументы в структуру и передает их.

1 голос
/ 07 октября 2011

Вы можете обернуть их вместе в структуру и передать указатель на эту структуру. Будьте осторожны, потому что эта структура должна , а не быть объявлена ​​локально для конструктора Backgrounder - это может привести к неопределенному поведению, потому что поток все еще может быть запущен после завершения функции, которая запустила его. Он должен быть либо динамически размещен, либо static член класса, либо глобальной переменной.

На самом деле, я бы пропустил указатель this, так как вы по сути хотите иметь возможность доступа к полям объекта в функции Run:

class Backgrounder{
    public:
        MESSAGE_QUEUE* m_pMsgQueue;
        LockSection* m_pLc;

        static void __cdecl Run (void *pThis) {
            MESSAGE_QUEUE* s_pMsgQueue = ((Backgrounder *) pThis)->m_pMsgQueue;
            LockSection* s_pLc = ((Backgrounder *) pThis)->m_pLc;
        }

        Backgrounder(MESSAGE_QUEUE* pMsgQueue,LockSection* pLc) { 
            m_pMsgQueue = pMsgQueue; 
            m_pLc = pLc;
            _beginthread(Run, 0, (void *) this); 
        }
        ~Backgrounder(){ }
    };

Конечно, вам необходимо убедиться, что вновь созданный объект Backgrounder не был преждевременно разрушен, то есть поток должен быть завершен до уничтожения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...