Текущий архив: 2006.06.25;
Скачать: CL | DM;
ВнизРихтер ошибся? Найти похожие ветки
← →
FunkyByte © (2006-03-27 23:50) [0]Доброго времени суток, уважаемые мастера. Создал простенькую тестовую программку, состоящую из окна и ещё одного потока (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, очередь сообщений потока не была создана, как должно было быть согласно Рихтеру. Неужели гуру Рихтер ошибся? Или это я что-то не так сделал?
← →
BiN © (2006-03-28 00:22) [1]
> Этот поток инициируется в обработчике 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
← →
Сергей М. © (2006-03-28 09:13) [2]
> Как сказано в MS SDK Help Files
GetLastError returns ERROR_INVALID_THREAD_ID if idThread is not a valid thread identifier.
identifier - это вовсе не handle, а глобально уникальный идентификатор потока.
← →
Lucefer (2006-03-28 13:09) [3]Надо
PostThreadMessage(HandlerThread.ThreadID,WM_TRANSIT,wParam(123),0)
:-) я тоже налетел, т.к. где-то в мсдн встретил нечто похожее на фразу о том, что ThreadID эквивалентен его хэндлу :-)
← →
Сергей М. © (2006-03-28 13:43) [4]Одно только не понятно - за что деда Рихтера с его THREADINFO и очередями нагнули до плинтуса..
Страницы: 1 вся ветка
Текущий архив: 2006.06.25;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.012 c