Потоки (Threads) и окна.
Модераторы: Duncon, Hawk, Romeo, Eugie
Можно ли в отдельном потоке создать постоянно живущее окно?
Если я ещё где-то не напортачил, то имею такую ситуацию: окно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
Спасибо за ответ.
Если я ещё где-то не напортачил, то имею такую ситуацию: окно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
Спасибо за ответ.
Даже самый дурацкий замысел можно воплотить мастерски
Можно.
Во всяком случае под виндами.
Просто фишка втом что насколько я помню винда прибивает поток если убит процесс, породивший твой поток.
Или я чего-то не понял
Во всяком случае под виндами.
Просто фишка втом что насколько я помню винда прибивает поток если убит процесс, породивший твой поток.
- так и надо - мусор-то за собой убирать надо. Поток прекратился значит и ресурсы все свои должен отдать и почиститьокно, созданное в отдельном потоке, прекращает своё существование вместе с завершением потока.
Или я чего-то не понял
В SAD - все в SAD.
Kolinus, процесс, породивший поток продолжает жить. Поток завершается, и вместе сним аннигилируют окна, в нём созданные. Чего я хочу избежать...
Даже самый дурацкий замысел можно воплотить мастерски
Конечно можно =)
только чтобы окно работало надо чтобы и поток его породивший работал. Точнее надо создать локальный для потока цикл обработки сообщений в функции потока -
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
hWnd = CreateWindow(...); //создаем окно
...
while (GetMessage(...)) // крутим цико сообщений пока окно не вызовет PostQuitMessage
{
TranslateMessage(...);
DispatchMessage(...);
}
return 0;
}
только чтобы окно работало надо чтобы и поток его породивший работал. Точнее надо создать локальный для потока цикл обработки сообщений в функции потока -
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
hWnd = CreateWindow(...); //создаем окно
...
while (GetMessage(...)) // крутим цико сообщений пока окно не вызовет PostQuitMessage
{
TranslateMessage(...);
DispatchMessage(...);
}
return 0;
}
Увы, это так. Поток владеет созданными в нем окнами, и при его завершении они уничтожаются. Поэтому если окно должно "жить долго", его обычно создают в главном потоке процесса.Поток завершается, и вместе сним аннигилируют окна, в нём созданные. Чего я хочу избежать...
Жаль. Я надеялся, что в одном потоке можно создать окно, принадлежащее другому. В данном случае главному потоку процесса-родителя.
Даже самый дурацкий замысел можно воплотить мастерски
В Рихтере написано, что ВСЕ созданные потоком объекты разрушаются при его сметри (система ПОЛЬНОСТЬЮ чисти весь его стек)
В SAD - все в SAD.
От создателей Windows на русском 
Посмотри AiK - это глава из Рихтера про потоки где все подробно объяснено - мот чем-т поможет
http://softs.h10.ru/literature.shtml?to ... =head6.htm

Посмотри AiK - это глава из Рихтера про потоки где все подробно объяснено - мот чем-т поможет
http://softs.h10.ru/literature.shtml?to ... =head6.htm
В SAD - все в SAD.
Можно. Я делал. Но нужны ОЧЕНЬ хорошие права. Для зловредных прог практически не подходит. Суть состоит в использовании CreateRemoteThread() можно создать свой поток хоть в kernel'е. Второй способ (описан или в том же Рихтере или в... а не помню). Называется "Секреты Windows 95" в NT'XP используется подобный механизм. Фактически, твоя прога должна взять на себя функции загрузчика и в ручную загрузить прогу в память. Но в случае NT твоя прога должна быть драйвером.
PS: Второй способ никогда не пробовал.
PS: Второй способ никогда не пробовал.
И накроет землю тень Армагеддона (и мы примем в этом активное участие
)

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

Даже самый дурацкий замысел можно воплотить мастерски