Re[7]: Обновление видов документа из потока
От: Serguei666 Беларусь  
Дата: 30.07.03 15:38
Оценка:
Здравствуйте, GraphX, Вы писали:

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


K>>Разница в том, что из потока нельзя напрямую доставать окна. Вы можете прямо обращаться из потока только к окну, которое его породило. А по другому, через главное род. окно, и желательно без пойнтеров (т.е. использовать HWND) и желательно PostMessage()


GX>Хмм. А как же я могу послать сообщение классу CDocument когда в нем нету SendMessage, он не является наследником CWnd.

Вы правы. Документу послать сообщение вы не можете — потому что посылать сообщения можно только окнам. Что вы могли бы сделать — послать сообщение окну, которое переадресовало бы его документу. Какому окну? Да тому же MainFrame, например. Стандартно MainFrame переадресует ваши WM_COMMAND сообщения документу.

GX>В ходе своих ночных размышлений пришел к нескольким вариантам:

GX>1. Можно привязаться к таймеру, по которому идет запрос данных (Таймер системный НО, создается он именно в потоке, поэтому как то его надо обратно передать) и обновлять окна по этому таймеру. Вопрос, можно ли както "найти" хэндл таймера?
Обновлять окна по таймеру — это то, что нужно. Зачем вам хэндл таймера, кстати? Нетуи у таймера никакого хэндла. Есть ID.

GX>2. Достать каждый CView через хэндлы и в цикле создавая MFCшные объекты при помощи FromHandle обновлять все окна (но это у меня вчера не захотело работать — окна не обновлялись).

Как бы я делал:
из цепочки, где таймер, по событию таймера посылал команду документу обновится. По этой команде документ вызывает UpdateAllViews

GX>К примеру (у меня окна обновляться не хотели):

GX>
GX>   POSITION pos = GetFirstViewPosition();
GX>   CWnd *pWnd;
GX>   while (pos != NULL)
GX>   {
GX>      CView* pView = GetNextView(pos);
GX>      pWnd = CWnd::FromHandle(pView->m_hWnd);
      pWnd->>UpdateWindow();
GX>   }   
GX>

Этот код я бы посоветовал вам убрать. Он бесполезен по двум причинам:
1. По моему, это же самое делает UpdateAllViews
2. Строчки
pWnd = CWnd::FromHandle(pView->m_hWnd);
pWnd->UpdateWindow();
бессмысленны


GX>3. Написать какимлибо образом диспатчер своего сообщения в CDocument — ловить свое сообщение и выполнять действие. Тут тоже пока я не врубаюсь как послать потом это сообщение чтобы оно дошло до CDocument'а


GX>Вобщем по всем 3м пунктам у меня нифига не вышло.
Хотите сказать 'спасибо'? Тогда поставьте оценку
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.