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

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


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


S>...

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

S>// Тут создается первый документ

S>CCommandLineInfo cmdInfo;
S>ParseCommandLine(cmdInfo);
S>...

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


У меня стоит .NET.. Там генерится такой код

    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CGuardManDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CGuardManView));
    AddDocTemplate(pDocTemplate);
    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);

Воткнул старт нового потока после этой строки, и все встало на свои места.. и обновление тож работает Спасибо всем!
Сделал через обычное сообщение для Main Frame'а.

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


S>Звучит ваше объяснение устрашающе.

S>SetTimer возвращает ID таймера. Зачем вам к ID еще и хэндл?
Я пользовался hTimer = CreateWaitableTimer(NULL, FALSE, _T("Lala"));
Работает тоже неплохо.

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

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

Да, но теперь я обновлением могу управлять в полной мере!
А так, наврядли бы смог.

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

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

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

Аналогично, просто не сразу их видишь именно из за простоты
GX>>>>Вобщем по всем 3м пунктам у меня нифига не вышло.
S>Именно для этого му на форуме и торчим — помогать другим решать проблемы. Что у вас не вышло?
Эта фраза была уже давно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.