![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Будет ли форма получать и обрабатывать сообщения при ожидании? [D7, WinXP]
Aleksandr. © (2004-09-21 16:08:00)В методе окна запускается поток, и окно ждет его завершения через WaitForSingleObject в цикле. Но этот поток может через PostMessage отправлять сообщения этому окну. Вот я и запутался совсем - будет ли оно в этом состоянии получать и обрабатывать эти сообшения? И как вообще правильнее это организовать, если такой подход неприемлем?
KSergey (2004-09-22 17:14:00) [1]> [33] Digitman © (22.09.04 16:32)
Ладно, понял. Спасибо.
Digitman (2004-09-22 16:32:00) [2]
> А тут получается (синтаксически)
не получается
Паскаль есть Паскаль
синтаксис передачи факт.параметра, форм.декл-ция которого выглядит как передача нетипиз.параметра по ссылке, требует "барана" в таких ситуациях
KSergey (2004-09-22 16:25:00) [3]> [31] Digitman © (22.09.04 16:11)
> твои выкрутасы с декларациями ?
Нет.
На мой взгляд (возможно испорченный сями) проще было оставить естественную, соответсвующую MSDN декларацию - указатель. Все остальное я бы к нему приводил при необходимости. И это было бы естественно (на мой взгляд)
И, к стати, я как-то не уверен на счет @F[0]. Может все же просто F[0]?
А ведь в случае просто указателя было бы как раз @F[0], что логично и естественно. А тут получается (синтаксически) как будто первый элемент передаю, по ссылке. А то, что при этом на самом деле указатель передается, подразумевающмйся как указатель на все "тело" массива - не слишком ли много подразумеваний??
Да, речь веду лишь про ф-ции WinAPI, т.к. в дельфийских библиотеках уже как раз все нормально, понятно и естественно.
Digitman (2004-09-22 16:11:00) [4]
> И зачем такой изврат
никакого "изврата"
Борланд вовсе не обязан лепить кучу оверлоуд-функций под каждый "случай твоей жизни" .. "случаев" этих м.б. туева хуча - сегодня ты возжелаешь определить массив как динамический, а завтра ты сподобишься указатель на данные своего массива хранить в нетипиз.указателе или еще х.з. в каком виде ...
что, Борланд таки обязан (?) предугадывать все возможные твои выкрутасы с декларациями ?
KSergey (2004-09-22 16:05:00) [5]> [29] Digitman © (22.09.04 15:26)
> а "если", то @F[0]
> Pointer(ph)^
Я так и подозревал... И зачем такой изврат, вот кто мне скажет?? Ну было бы описано как указатель...
Ну да ладно. Понял. Спасибо.
Digitman (2004-09-22 15:26:00) [6]
> сообение жду, а не завершение треда
ну и жди ! тот же WaitMessage или - что удобней - GetMessage ..
> А если
а "если", то @F[0]
> Как теперь
Pointer(ph)^
KSergey (2004-09-22 15:19:00) [7]> [27] Digitman © (22.09.04 14:23)
> во-первых, GetCurrentThread возвращает псевдохэндл тек.трэда
> во-вторых, код этот несуразен даже по логике - каков смысл
> ожидать завершения текущего трэда, если он не завершится
> пока явно выполняет некий цикл ?
А я сообение жду, а не завершение треда ;)
Впрочем, наверняка идиотизм, не спорю. WaitMessage мне попалась позже...
смотря как он, массив, объявлен тобой
конкретно в случае когда F: array[..] of THandle передача его в кач-ве параметра должна выглядеть просто как F
А если
F: array of THandle
SetLength(F, ..)
Как тут быть?
> > А если я динамически выделил память?
> приводи конкретный пример
ph: PHandle;
GetMem (Pointer(ph), SizeOf(THandle)*5); // выделил под 5 элементов
... чем-то заполнил...
Как теперь этот надбор хендлов, на которые указывает ph, передать в MsgWaitForMultipleObjects?
Digitman (2004-09-22 14:23:00) [8]
> KSergey © (22.09.04 14:09) [26]
во-первых, GetCurrentThread возвращает псевдохэндл тек.трэда
во-вторых, код этот несуразен даже по логике - каков смысл ожидать завершения текущеготрэда, если он не завершится пока явно выполняет некий цикл ?
> Массив как туда запихать?
"пихать" ничего никуда не надо - "пихалка" может сломаться
смотря как он, массив, объявлен тобой
конкретно в случае когда F: array[..] of THandle передача его в кач-ве параметра должна выглядеть просто как F
> А если я динамически выделил память?
приводи конкретный пример
KSergey (2004-09-22 14:09:00) [9]> [25] Digitman © (22.09.04 13:56)
> > Что там не верно? Формально?
> конкретно в ЭТОЙ строке "формальных неверностей" как бы
> не наблюдается ...
> Непонятно, что за "нифига" ..
Нифига - вот какая штука: первый раз все проходит (смотрим код в [14]).
Второй и последующие возвращается WAIT_FAILED, RaiseLastWin32Error ренерит ошибку "неверный дескриптор, код 6". Значение pH не меняется от вызова к вызову.
Впрочем, возможно я книжки не дочитал.
> > Какой гад в дельфи описал второй параметр как var?? Неужели
> > нельзя было нормально указатель воткнуть?
> а в чем сложности-то ?
Массив как туда запихать? Не, я догадываюсь, что arr[0], но не логично, правда? Просто arr - я не уверен, что верно... Или заблуждаюсь?
Ну да это пол-беды.
А если я динамически выделил память? Есть у меня указатель на ее начало, и что мне передавать в качестве параметра в эту ф-цию, интересно?
Digitman (2004-09-22 13:56:00) [10]
> Что там не верно? Формально?
конкретно в ЭТОЙ строке "формальных неверностей" как бы не наблюдается ...
Непонятно, что за "нифига" ..
> Какой гад в дельфи описал второй параметр как var?? Неужели
> нельзя было нормально указатель воткнуть?
а в чем сложности-то ?
KSergey (2004-09-22 13:46:00) [11]> Digitman © (22.09.04 13:41) [23]
Будьте любезны, гляньте еще раз код из [14]. Что там не верно? Формально?
Приведу еще раз, "избранное":
pH: THandle;
MsgWaitForMultipleObjects(1, pH,
Где я не прав??
PS
Какой гад в дельфи описал второй параметр как var?? Неужели нельзя было нормально указатель воткнуть?
Digitman (2004-09-22 13:41:00) [12]
> А фигли
"фигли", не "фигли" ..
если объектов синхрогизации более одного, 2-м параметром нужно передавать нужно адресмассива хэндлов объектов синхронизации ! .. а 1-м параметром - число эл-тов этого массива ...
вот тогда и не будет никаких "фигли" )
KSergey (2004-09-22 13:41:00) [13]Елки, в моем случае вообще проканала WaitMessage... И как я ее сразу проглядел в ShowModal...
KSergey (2004-09-22 13:35:00) [14]> Digitman © (22.09.04 13:18) [18]
> > получается, Handle треда передавать туда и вовсе нельзя??
> что значит "нельзя" ? а для чего ж тогда эта ф-ция вообще
> существует по-твоему ?
А фигли она у меня тогда в [14] ошибку возвращает? ;)
KSergey (2004-09-22 13:33:00) [15]> Warlock © (22.09.04 13:22) [19]
Мне кажется, что более оправданным было бы постить сообщения окну с индикатором и через параметры сообщения сообщать сколько процентов.
Warlock (2004-09-22 13:22:00) [16]А если вернуться к цели этой задачи -
А как же быть с визуализацией - прогрессбаром в этом окне, например, показывающем процент выполнения потоком задач
Можно просто использовать Метод потока Synchronize
Digitman (2004-09-22 13:18:00) [17]
> KSergey © (22.09.04 12:54) [17]
> получается, Handle треда передавать туда и вовсе нельзя??
что значит "нельзя" ? а для чего ж тогда эта ф-ция вообще существует по-твоему ?
для ожидания ТОЛЬКО сообщений есть Getmessage()
эта же ф-ция предназначена специально для ожидания срабатывания конкретных объектов синхронизации и при этом немедленной реакции на сообщения в очереди трэда, вызывавшего эту ф-цию
иными словами, по функциональности этот вызов эквивалентен "комбинации" вызовов WaitForMultipleObjects и GetMessage
KSergey (2004-09-22 12:54:00) [18]> [15] Digitman © (22.09.04 12:34)
Не понимаю, блин....
У меня заработало (если так можно сказать)
pH := 0; // да хоть что
MsgWaitForMultipleObjects( 0, pH, FALSE, INFINITE, QS_ALLINPUT {QS_PAINT});
Т.е., получается, Handle треда передавать туда и вовсе нельзя?? Вроде в примерах - находил..
Aleksandr. (2004-09-22 12:40:00) [19]Круто! Работает! Спасибо!
Digitman (2004-09-22 12:34:00) [20]var
Msg: TMsg;
...
while True do
case MsgWaitForMultipleObjects(1,A,false,1000,QS_AllINPUT) of
Wait_Object_0: Break;
Wait_Object_0 + 1:
while Peekmessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
и все ! вуаля !