мистика с propertisheet в потоке

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 13 авг 2006.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Интерфейс миничата замутил на основе propertisheet, приваты - доп.вкладки, т.к. изначально не известно скоко вкладок, по мере их появления, я высчитываю хендлы диалогов и edit'ов.
    И вроде как всё работало пока не попытался создать вкладку из потока.
    Каким боком из потока не хотит создавать окно со всем содержимым не пойму.., т.е. вкладку с название создаёт и всё.
    Посмотрите плиз, может, как обычно, я что-то пропустил...
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    CreateDialogParamA не корректно работает в потоке.
    msdn молчит.
    Не сталкивались с такой проблемой?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    Читаем Рихтера: "... два User объекта (окна и ловушки) принадлежат только создавшему их потоку ... если поток создает окно или устанавливает ловушку а потом завершается, операционная система автоматически уничтожает окно или удаляет ловушку ...".

    Твоя функция потока добавляет диалог и завершается, система видит, что поток завершил работу и удаляет диалог. Если функцию потока переписать так:
    Код (Text):
    1. Thread1 proc
    2.        invoke AddPrivatMes,$CTA0("Nickname"),$CTA0("message")
    3.        invoke Sleep, 100000 ;; 100 секунд
    4.        ret
    5. Thread1 endp
    то, например, при помощи Microsoft Spy можно убедиться, что диалог создается.

    У Рихтера есть разделы которые так и называются "В каких случаях потоки создаются" и "И в каких случаях потоки не создаются". Цитата из второго: "... многопоточность следует использовать разумно. Не создавайте несколько потоков только потому, что это возможно ...".
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    q_q, привет, давно не было видно тебя на форуме ;)
    Файл в аттаче я подчистил от всякой нечисти.., 0на самом деле после создания поток не закончивает свою работу, а идёт на recv. Тот же самый эффект получается что и когда sleep стоит, может и диалог создаётся, но вкладка не переключается.., поменял sleep на invoke MessageBox,0,0,0,0 и заработало...

    Это уже проблемы обработки WM_NOTIFY/TCN_SELCHANGE ?
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    поменял sleep на invoke MessageBox,0,0,0,0 и заработало ...
    Это иллюзия.
    Мне удается, щелкая по закладкам, открывать закладку Nickname без элементов диалога.

    Читаем psdk раздел Creating Windows in Threads: "... the thread must provide a message loop to process the messages in its message queue ...". Добавляя в функцию потока вызов MessageBox ты обеспечиваешь для потока цикл обработки сообщений, видимо не полноценный.