Как в WTL изменить стандартный цикл сообщений своим?
От: qube  
Дата: 07.08.03 09:46
Оценка:
Есть необходимость в главном потоке приложения наряду с выборкой и обработкой сообщений дожидаться просигналенного состояния некоторого синхронизационного объекта. Как реализовать такой цикл сообщений -- понятно (MsgWaitForxxx и т.д.), но вот как его потом прикрутить к WTL?
Re: Как в WTL изменить стандартный цикл сообщений своим?
От: Voyachek Vladislav  
Дата: 07.08.03 11:36
Оценка:
Здравствуйте, qube, Вы писали:

Q>Есть необходимость в главном потоке приложения наряду с выборкой и обработкой сообщений дожидаться просигналенного состояния некоторого синхронизационного объекта.


Может AtlWaitWithMessageLoop подойдет?
... << RSDN@Home 1.1 beta 1 >>
Re: Как в WTL изменить стандартный цикл сообщений своим?
От: Denis Titov Россия  
Дата: 07.08.03 11:38
Оценка:
Здравствуйте, qube, Вы писали:

Q>Есть необходимость в главном потоке приложения наряду с выборкой и обработкой сообщений дожидаться просигналенного состояния некоторого синхронизационного объекта. Как реализовать такой цикл сообщений -- понятно (MsgWaitForxxx и т.д.), но вот как его потом прикрутить к WTL?


Я думаю, надо написать потомка CMessageLoop и использовать его.
Re[2]: Как в WTL изменить стандартный цикл сообщений своим?
От: qube  
Дата: 07.08.03 12:02
Оценка:
Здравствуйте, Denis Titov, Вы писали:

DT>Здравствуйте, qube, Вы писали:



DT>Я думаю, надо написать потомка CMessageLoop и использовать его.

Как мне кажется, не выйдет, ибо методы у CMessageLoop не виртуальные.
Re[2]: Как в WTL изменить стандартный цикл сообщений своим?
От: PM  
Дата: 07.08.03 12:04
Оценка:
Здраствуйте, Denis Titov. Вы писали:

DT> Я думаю, надо написать потомка CMessageLoop и использовать его.

Скорее уж CMessageFilter
Posted via RSDN NNTP Server 1.7 beta
Re[2]: Как в WTL изменить стандартный цикл сообщений своим?
От: qube  
Дата: 07.08.03 12:10
Оценка:
Здравствуйте, Voyachek Vladislav, Вы писали:

VV>Здравствуйте, qube, Вы писали:


Q>>Есть необходимость в главном потоке приложения наряду с выборкой и обработкой сообщений дожидаться просигналенного состояния некоторого синхронизационного объекта.


VV>Может AtlWaitWithMessageLoop подойдет?


Как тогда должна выглядеть WinMain()? Сейчас она выглядит стандартно:

CMessageLoop theLoop;
_Module.AddMessageLoop(&theLoop);
if(dlgMain.Create(NULL) == NULL)
{
  ATLTRACE(_T("Main dialog creation failed!\n"));
  return 0;
}
dlgMain.ShowWindow(nCmdShow);
int nRet = theLoop.Run();

_Module.RemoveMessageLoop();
return nRet;


Или можно просто реализовать циыкл сообщений с любой доп. обработкой в WinMain, не вызывая _Module.AddMessageLoop() и theLoop.Run()?
Re[2]: Как в WTL изменить стандартный цикл сообщений своим?
От: Voyachek Vladislav  
Дата: 07.08.03 14:33
Оценка:
Здравствуйте, Voyachek Vladislav, Вы писали:

VV>Может AtlWaitWithMessageLoop подойдет?


Я тут немножко потопился. Тебе, наверное, так нужно поступить:

В программе д.б. такие строчки (их создает мастер):


    //attach message loop
    CMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);


Так вот, нужно заменить класс CMessageLoop своим — наследуйся от него и переопредели функцию Run.
В этой функции напиши все что надо (посмотри ее стандартную реализацию в WTL). Не забудь также вызвать всякие OnIdle (в ней же).
... << RSDN@Home 1.1 beta 1 >>
Re[3]: Как в WTL изменить стандартный цикл сообщений своим?
От: qube  
Дата: 07.08.03 14:40
Оценка:
Здравствуйте, Voyachek Vladislav, Вы писали:



VV>Так вот, нужно заменить класс CMessageLoop своим — наследуйся от него и переопредели функцию Run.

VV>В этой функции напиши все что надо (посмотри ее стандартную реализацию в WTL). Не забудь также вызвать всякие OnIdle (в ней же).

CMessageLoop::Run() -- не виртуальная, так что наследование не поможет
Re[3]: Как в WTL изменить стандартный цикл сообщений своим?
От: Voyachek Vladislav  
Дата: 07.08.03 14:45
Оценка:
Здравствуйте, qube, Вы писали:

DT>>Я думаю, надо написать потомка CMessageLoop и использовать его.

Q>Как мне кажется, не выйдет, ибо методы у CMessageLoop не виртуальные.

Выйдет, выйдет. Будет нечто вроде:


int main()
{
    //attach message loop
    CMyMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);
        
    ...........
        
    theLoop.Run();    //твой метод
        
    ............
}    

class CMyMessageLoop : public CMessageLoop
{
    int Run()
    {
        .....
        
        MsgWait......
    
        .....
    }
};


Будет вызываться метод Run от нового класса — ведь он вызывается один раз в main.
... << RSDN@Home 1.1 beta 1 >>
Re[3]: Как в WTL изменить стандартный цикл сообщений своим?
От: Voyachek Vladislav  
Дата: 07.08.03 14:46
Оценка:
Здравствуйте, qube, Вы писали:

DT>>Я думаю, надо написать потомка CMessageLoop и использовать его.

Q>Как мне кажется, не выйдет, ибо методы у CMessageLoop не виртуальные.

Выйдет, выйдет. Будет нечто вроде:


int main()
{
    //attach message loop
    CMyMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);
        
    ...........
        
    theLoop.Run();    //твой метод
        
    ............
}    

class CMyMessageLoop : public CMessageLoop
{
    int Run()
    {
        .....
        
        MsgWait......
    
        .....
    }
};


Будет вызываться метод Run от нового класса — ведь он вызывается один раз в main.
... << RSDN@Home 1.1 beta 1 >>
Re[4]: Как в WTL изменить стандартный цикл сообщений своим?
От: Voyachek Vladislav  
Дата: 07.08.03 14:52
Оценка:
Здравствуйте, qube, Вы писали:

Q>CMessageLoop::Run() -- не виртуальная, так что наследование не поможет


Давно бы уж попробовал. Тебе тут не нужна виртуальность — функцию Run ты вызываешь сам в функции main! Больше в библиотеке wtl она нигде не вызывается. А ссылка на объект theLoop нужна в _Module для добавления различных фильтров и т.п.. Но тебе же не надо (наверное) переопределять эти функции — только Run.
... << RSDN@Home 1.1 beta 1 >>
Re[5]: Как в WTL изменить стандартный цикл сообщений своим?
От: qube  
Дата: 08.08.03 08:12
Оценка:
Здравствуйте, Voyachek Vladislav, Вы писали:

VV>Давно бы уж попробовал. Тебе тут не нужна виртуальность — функцию Run ты вызываешь сам в функции main! Больше в библиотеке wtl она нигде не вызывается. А ссылка на объект theLoop нужна в _Module для добавления различных фильтров и т.п.. Но тебе же не надо (наверное) переопределять эти функции — только Run.


Спасибо, отличная идея.
Мне действительно нужно переопределить только Run.
Re[3]: Как в WTL изменить стандартный цикл сообщений своим?
От: Аноним  
Дата: 08.08.03 13:18
Оценка:
Здравствуйте, PM, Вы писали:

PM>Здраствуйте, Denis Titov. Вы писали:


DT>> Я думаю, надо написать потомка CMessageLoop и использовать его.

PM>Скорее уж CMessageFilter

лучше использовать Idle
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.