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

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

Будет ли форма получать и обрабатывать сообщения при ожидании? [D7, WinXP]


Страницы:   1 2

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;

и все ! вуаля !


Страницы:   1 2

Наверх

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