Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2012, 04:21   #1
Genco
Пользователь
 
Аватар для Genco
 
Регистрация: 16.11.2010
Сообщений: 46
По умолчанию MFC. Сообщения. Взаимодействие классов в потоке.

Приветствую всех!

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

У кого есть идеи - помогите советом, что-я-делаю-не-так??
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться"
Genco вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод сообщения в отдельном потоке и т.д. Casper-SC Общие вопросы .NET 7 18.05.2010 03:32
С++ классы, взаимодействие классов nomaddc Помощь студентам 0 27.04.2010 21:46
Взаимодействие C# и 1с Sparky Свободное общение 1 05.02.2010 04:31
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18