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

GX>Теперь я как раз и делаю по этому варианту. Правда вляпался что когда создается Документ объекта главного окна еще нет. Точнее не получается воспользоваться AfxGetMainWnd(). А тогда когда же мне запускать поток, передавай туда хэндл главного окна получить которое я не могу


Смотрим на стандартно сгенерированную Визардом функцию InitInstance

...
// Тут создается главное окно
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;

// Тут создается первый документ
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
...

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

GX>Аз есьм! Как же без хэндла. Просто я создаю таймер уже в рабочем потоке при помощи апишных функций, а это значит, что он заносится в списки Виндов под какимто именем, оказывается по этому имени можно получить хэндл на таймер. Только вот опять-же это не удобно так как получать его надо уже после того как таймер создастся.. а отловить этот момент тяжко хотя можно при помощи событий.. хмм а эта мысля мне еще не приходила!


Звучит ваше объяснение устрашающе.
SetTimer возвращает ID таймера. Зачем вам к ID еще и хэндл?

GX>Да, это конечно хорошо, а если окна не надо обновлять, то мы их все равно обновляем

Не понял. Разве не обновление окон было вашим вопросом? Вы же написали "После обновления списка, необходимо обновить все виды из потока". Или я чего-то недоглядел?

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>>бессмысленны
GX>Это не бессмысленно когда такой код запускается из другого потока
GX>Так как UpdateAllViews выдает ошибку!
Я же вам написал, как эту ошибку преодолеть — вы не вызываете из другого потока функцию документа UpdateAllViews — а посылаете сообщение главному окну, и документ, реагируя на сообщение, делает UpdateAllViews

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

Этого я вам не советовал.
И вообще, я сторонник простых решений.

GX>>>Вобщем по всем 3м пунктам у меня нифига не вышло.

Именно для этого му на форуме и торчим — помогать другим решать проблемы. Что у вас не вышло?
Хотите сказать 'спасибо'? Тогда поставьте оценку
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.