Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.04 c
15-1148974453
Иксик
2006-05-30 11:34
2006.06.25
Протесты азербайджанцев в Иране


4-1142961749
Woolen
2006-03-21 20:22
2006.06.25
Определение блокировки рабочей станции


2-1149670850
NikSoft
2006-06-07 13:00
2006.06.25
Панель задач и реестр XP


2-1149681186
фыв
2006-06-07 15:53
2006.06.25
Компонент в определенном месте на поле


3-1146564654
wirg
2006-05-02 14:10
2006.06.25
Помогите с кавычками