Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рихтер ошибся? [D7, WinXP]


FunkyByte ©   (2006-03-27 23:50:00) 

Доброго времени суток, уважаемые мастера. Создал простенькую тестовую программку, состоящую из окна и ещё одного потока (TThread). В методе Execute класса потока написано следующее:

 GetMessage(Msg,Handle,WM_TRANSIT,WM_TRANSIT);
 WaitMessage;

Собственно, GetMessage я вызвал с единственной целью: заставить Винды создать очередь сообщений у этого потока.
Ибо дедушка Рихтер сказал:
"Создавая какой-либо поток, система предполагает, что он не будет иметь отношения к поддержке пользовательского интерфейса. Это позволяет уменьшить объем выделяемых ему системных ресурсов. Но, как только поток обратится к той или иной GUI-функции (например, для проверки очереди сообщенийили создания окна), система автоматически выделит ему дополнительные ресурсы, необходимые для выполнения задач, связанных с пользовательским интерфейсом А если конкретнее, то система создает структуру THREADINFO и сопоставляет ее с этим потоком"
А как сказано у того же Рихтера, структура THREADINFO как раз и содержит указатели на очереди сообщений потока.
Этот поток инициируется в обработчике OnCreate основного окна программки следующим образом:
HandlerThread:=THandlerThread.Create(False);
Из того же основного окна я отсылаю сообщение WM_TRANSIT = WM_USER+1 вышеупомянутому потоку следующим образом:
PostThreadMessage(HandlerThread.Handle,WM_TRANSIT,wParam(123),0)
При этом возникает ошибка ERROR_INVALID_THREAD_ID. Как сказано в MS SDK Help Files (тех самых, которые поставляются вместе с Дэлфями), эта ошибка при вызове PostThreadMessage может возникать в 2-х случаях: не найден поток с указанным дескриптором или у указанного потока отсутствует очередь сообщений. Поток на момент отсылки сообщения никуда не девался - проверено старым добрым виндовым TaskManager'ом. Значит, остаётся только одно - несмотря на вызов GetMessage, очередь сообщений потока не была создана, как должно было быть согласно Рихтеру. Неужели гуру Рихтер ошибся? Или это я что-то не так сделал?


Сергей М.   (2006-03-28 13:43:00) [1]

Одно только не понятно - за что деда Рихтера с его THREADINFO и очередями нагнули до плинтуса..


Lucefer   (2006-03-28 13:09:00) [2]

Надо
PostThreadMessage( HandlerThread.ThreadID,WM_TRANSIT,wParam(123),0)
:-) я тоже налетел, т.к. где-то в мсдн встретил нечто похожее на фразу о том, что ThreadID эквивалентен его хэндлу :-)


Сергей М.   (2006-03-28 09:13:00) [3]


> Как сказано в MS SDK Help Files


GetLastError returns ERROR_INVALID_THREAD_ID if idThread is not a valid thread identifier.

identifier - это вовсе не handle, а глобально уникальный идентификатор потока.


BiN   (2006-03-28 00:22:00) [4]


> Этот поток инициируется в обработчике OnCreate основного
> окна программки следующим образом:
> HandlerThread:=THandlerThread.Create(False);
> Из того же основного окна я отсылаю сообщение WM_TRANSIT
> = WM_USER+1 вышеупомянутому потоку следующим образом:
> PostThreadMessage(HandlerThread.Handle,WM_TRANSIT,wParam(123),
> 0)
> При этом возникает ошибка ERROR_INVALID_THREAD_ID.

А что по твоему должно возвращаться, если ты вместо идентификаторы потока передаешь его хэндл.

ЗЫ.
"Ибо дедушка Рихтер сказал..."

Почему так часто Рихтера представляют стариком?
http://www.wintellect.com/Bio.aspx


Наверх

Титульная страница Поиск, карта сайта Написать письмо