Приветствую всех участников!
Возможно, вопрос самоочевиден, но хелы, гайды и 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 не реагирует, я замучался. Получается, что создавать полноценное окно мне не нужно, а вот обмениваться сообщениями, не вешая интерфейс (т.е. в отдельном потоке, где вся логика) — необходимо.
У кого есть идеи — помогите, пожалуйста, советом: что-я-делаю-не-так??