![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рихтер ошибся? [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