Страница 1 из 2

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

Добавлено: 29 сен 2004, 02:27
AiK
Можно ли в отдельном потоке создать постоянно живущее окно?
Если я ещё где-то не напортачил, то имею такую ситуацию: окно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
Спасибо за ответ.

Добавлено: 29 сен 2004, 16:48
Kolinus
Можно.
Во всяком случае под виндами.
Просто фишка втом что насколько я помню винда прибивает поток если убит процесс, породивший твой поток.
окно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
- так и надо - мусор-то за собой убирать надо. Поток прекратился значит и ресурсы все свои должен отдать и почистить
Или я чего-то не понял

Добавлено: 29 сен 2004, 17:15
AiK
Kolinus, процесс, породивший поток продолжает жить. Поток завершается, и вместе сним аннигилируют окна, в нём созданные. Чего я хочу избежать...

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

DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
hWnd = CreateWindow(...); //создаем окно
...
while (GetMessage(...)) // крутим цико сообщений пока окно не вызовет PostQuitMessage
{
TranslateMessage(...);
DispatchMessage(...);
}
return 0;
}

Добавлено: 29 сен 2004, 17:48
Eugie
Поток завершается, и вместе сним аннигилируют окна, в нём созданные. Чего я хочу избежать...
Увы, это так. Поток владеет созданными в нем окнами, и при его завершении они уничтожаются. Поэтому если окно должно "жить долго", его обычно создают в главном потоке процесса.

Добавлено: 29 сен 2004, 17:53
AiK
Жаль. Я надеялся, что в одном потоке можно создать окно, принадлежащее другому. В данном случае главному потоку процесса-родителя.

Добавлено: 29 сен 2004, 18:00
Kolinus
В Рихтере написано, что ВСЕ созданные потоком объекты разрушаются при его сметри (система ПОЛЬНОСТЬЮ чисти весь его стек)

Добавлено: 29 сен 2004, 18:03
Kolinus
От создателей Windows на русском ;)
Посмотри AiK - это глава из Рихтера про потоки где все подробно объяснено - мот чем-т поможет
http://softs.h10.ru/literature.shtml?to ... =head6.htm

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

PS: Второй способ никогда не пробовал.

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