MFC. Сообщения. Взаимодействие классов в потоке.
От: Genco  
Дата: 18.02.12 00:39
Оценка:
Приветствую всех участников!

Возможно, вопрос самоочевиден, но хелы, гайды и MSDN не помогли.
Возникла у меня не очень понятная проблема по основам, ответ на которую не находится ну никак.
Что хочу/нужно: создать в программе отдельный от основного поток, там будут работать 2 класса. У одного будет 1 экземпляр, ожидающий сообщения, у другого — куча экземпляров, их отсылающих. Вроде бы ничего сверхъестественного, но...
class CContext: public CWnd
{
private:
           //тут всякое...
    int id_counter;
protected:
    // (AFX_MSG_MAP(CContext)
    afx_msg int OnRecalc(TMSG *msg);
    //{(AFX_MSG_MAP)

    //тут всякое...
    DECLARE_MESSAGE_MAP()  //!!!
public:
    CContext(void): CWnd() { id_counter=0; }
            //тут всякое...
    ~CContext(void);
};

Это такой вот класс (не важно, что в нем напихано), пришлось наследоваться от CWnd, чтоб слушать сообщения. В нем есть карта сообщений (приписал в реализации):
BEGIN_MESSAGE_MAP(CContext, CWnd)
// (AFX_MSG_MAP(CContext)
    ON_KR_RECALC(OnRecalc)
    //ON_REGISTERED_MESSAGE(KR_RECALC,OnSample)
//{(AFX_MSG_MAP)
END_MESSAGE_MAP()

Тоже стандартно. Далее хитрее — класс, который будет что-то слать, передавая инфу через lParam:
#define RECALC_TAG _T("WAKEUP")
//Ерунда ниже, кстати, рабочая, взято с rsdn
#define ON_KR_RECALC(memberFxn) \
{ KR_RECALC, 0, 0, 0, AfxSig_is, (AFX_PMSG)(AFX_PMSGW) \
    (int (CWnd::*)(TMSG*))(memberFxn) },
//----------------------------------------------------

typedef struct MyMSG
{
    //бла-бла
} TMSG;

const int dt=700;

class KR_Object
{
    friend class CContext;
protected:
    int ID;
    CContext *context;
    void send_event(int dest, UINT span=dt);
public:
    virtual void do_job()=0;     //да, я от него наследуюсь по-всякому
    virtual void wakeup();     //не суть, что это всё
    void receive_event(TMSG);
};

//бла-бла
static const UINT NEAR KR_RECALC = ::RegisterWindowMessage(RECALC_TAG);

Оставил везде в приводимом самое основное, показать структуру моей "поделки", меньше не получится без потери смысла.
Непосредственно с самой посылкой всё вообще нехорошо, есть куча способов по идее, и ни один не работает((
SendMessage()/PostMessage() — неизвестен дескриптор, не катит
context->SendMessage() — внутри класса дескриптор невалидный, опять облом.
PostThreadMessage() — главная надежда, отсылка всему потоку, шлю, узнавая ID текущего потока и получаю облом.

CContext не реагирует, я замучался. Получается, что создавать полноценное окно мне не нужно, а вот обмениваться сообщениями, не вешая интерфейс (т.е. в отдельном потоке, где вся логика) — необходимо.

У кого есть идеи — помогите, пожалуйста, советом: что-я-делаю-не-так??
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.