Здравствуйте, Serguei666, Вы писали:
K>>>Разница в том, что из потока нельзя напрямую доставать окна. Вы можете прямо обращаться из потока только к окну, которое его породило. А по другому, через главное род. окно, и желательно без пойнтеров (т.е. использовать HWND) и желательно PostMessage()
GX>>Хмм. А как же я могу послать сообщение классу CDocument когда в нем нету SendMessage, он не является наследником CWnd.
S>Вы правы. Документу послать сообщение вы не можете — потому что посылать сообщения можно только окнам. Что вы могли бы сделать — послать сообщение окну, которое переадресовало бы его документу. Какому окну? Да тому же MainFrame, например. Стандартно MainFrame переадресует ваши WM_COMMAND сообщения документу.
Теперь я как раз и делаю по этому варианту. Правда вляпался что когда создается Документ объекта главного окна еще нет. Точнее не получается воспользоваться AfxGetMainWnd(). А тогда когда же мне запускать поток, передавай туда хэндл главного окна получить которое я не могу
GX>>В ходе своих ночных размышлений пришел к нескольким вариантам:
GX>>1. Можно привязаться к таймеру, по которому идет запрос данных (Таймер системный НО, создается он именно в потоке, поэтому как то его надо обратно передать) и обновлять окна по этому таймеру. Вопрос, можно ли както "найти" хэндл таймера?
S>Обновлять окна по таймеру — это то, что нужно. Зачем вам хэндл таймера, кстати? Нетуи у таймера никакого хэндла. Есть ID.
Аз есьм! Как же без хэндла. Просто я создаю таймер уже в рабочем потоке при помощи апишных функций, а это значит, что он заносится в списки Виндов под какимто именем, оказывается по этому имени можно получить хэндл на таймер. Только вот опять-же это не удобно так как получать его надо уже после того как таймер создастся.. а отловить этот момент тяжко

хотя можно при помощи событий.. хмм а эта мысля мне еще не приходила!
GX>>2. Достать каждый CView через хэндлы и в цикле создавая MFCшные объекты при помощи FromHandle обновлять все окна (но это у меня вчера не захотело работать
— окна не обновлялись).
S>Как бы я делал:
S>из цепочки, где таймер, по событию таймера посылал команду документу обновится. По этой команде документ вызывает 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>>
S>Этот код я бы посоветовал вам убрать. Он бесполезен по двум причинам:
S>1. По моему, это же самое делает UpdateAllViews
S>2. Строчки
S>pWnd = CWnd::FromHandle(pView->m_hWnd);
pWnd->>UpdateWindow();
S>бессмысленны
Это не бессмысленно когда такой код запускается из другого потока
Так как UpdateAllViews выдает ошибку!
GX>>3. Написать какимлибо образом диспатчер своего сообщения в CDocument — ловить свое сообщение и выполнять действие. Тут тоже пока я не врубаюсь как послать потом это сообщение чтобы оно дошло до CDocument'а
GX>>Вобщем по всем 3м пунктам у меня нифига не вышло.