Потоки (Threads) и окна.

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

29 сен 2004, 02:27

Можно ли в отдельном потоке создать постоянно живущее окно?
Если я ещё где-то не напортачил, то имею такую ситуацию: окно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
Спасибо за ответ.
Даже самый дурацкий замысел можно воплотить мастерски
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

29 сен 2004, 16:48

Можно.
Во всяком случае под виндами.
Просто фишка втом что насколько я помню винда прибивает поток если убит процесс, породивший твой поток.
окно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
- так и надо - мусор-то за собой убирать надо. Поток прекратился значит и ресурсы все свои должен отдать и почистить
Или я чего-то не понял
В SAD - все в SAD.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

29 сен 2004, 17:15

Kolinus, процесс, породивший поток продолжает жить. Поток завершается, и вместе сним аннигилируют окна, в нём созданные. Чего я хочу избежать...
Даже самый дурацкий замысел можно воплотить мастерски
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

29 сен 2004, 17:33

Конечно можно =)
только чтобы окно работало надо чтобы и поток его породивший работал. Точнее надо создать локальный для потока цикл обработки сообщений в функции потока -

DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
hWnd = CreateWindow(...); //создаем окно
...
while (GetMessage(...)) // крутим цико сообщений пока окно не вызовет PostQuitMessage
{
TranslateMessage(...);
DispatchMessage(...);
}
return 0;
}
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

29 сен 2004, 17:48

Поток завершается, и вместе сним аннигилируют окна, в нём созданные. Чего я хочу избежать...
Увы, это так. Поток владеет созданными в нем окнами, и при его завершении они уничтожаются. Поэтому если окно должно "жить долго", его обычно создают в главном потоке процесса.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

29 сен 2004, 17:53

Жаль. Я надеялся, что в одном потоке можно создать окно, принадлежащее другому. В данном случае главному потоку процесса-родителя.
Даже самый дурацкий замысел можно воплотить мастерски
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

29 сен 2004, 18:00

В Рихтере написано, что ВСЕ созданные потоком объекты разрушаются при его сметри (система ПОЛЬНОСТЬЮ чисти весь его стек)
В SAD - все в SAD.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

29 сен 2004, 18:03

От создателей Windows на русском ;)
Посмотри AiK - это глава из Рихтера про потоки где все подробно объяснено - мот чем-т поможет
http://softs.h10.ru/literature.shtml?to ... =head6.htm
В SAD - все в SAD.
Dragonfly
Сообщения: 15
Зарегистрирован: 01 окт 2004, 18:23
Откуда: Киев

01 окт 2004, 20:18

Можно. Я делал. Но нужны ОЧЕНЬ хорошие права. Для зловредных прог практически не подходит. Суть состоит в использовании CreateRemoteThread() можно создать свой поток хоть в kernel'е. Второй способ (описан или в том же Рихтере или в... а не помню). Называется "Секреты Windows 95" в NT'XP используется подобный механизм. Фактически, твоя прога должна взять на себя функции загрузчика и в ручную загрузить прогу в память. Но в случае NT твоя прога должна быть драйвером.

PS: Второй способ никогда не пробовал.
И накроет землю тень Армагеддона (и мы примем в этом активное участие :) )
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

02 окт 2004, 04:39

Dragonfly, прога сверхзловредная :) - это тулбар для IE. Так что вариант с драйвером не годится. CreateRemoteThread пробовал, разницы с CreateThread никакой не обнаружил. Похоже придётся с окном связывать данные и обновлять по мере получения в потоке...
Даже самый дурацкий замысел можно воплотить мастерски
Ответить