psa1974
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Grande Насчет SendMessage и ReplyMessage... Вот сбацал тест: Код: const WM_PSA = WM_APP+ 1; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure WMPsa(var MSg: TMessage); message WM_PSA; end; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SendMessage(Self.Handle, WM_PSA, 0, 0); //шлем сообщение ShowMessage('*'); // после возврата из сообщения должна вылести мессага "*" end; procedure TForm1.WMPsa(var MSg: TMessage); begin ReplyMessage(0); // возвращаем результат while True do ; //продолжаем до бесконечности обрабатывать сообщение end; | Цитата: Далее прога продолжает свою работу, а всё, что в обработчике сообщения - свою. | Дык вот... не работает это утверждение! строка ShowMessage('*'); никогда не выполнится в вышепериведенном примере, потому что мы никогда не закончим обрабатывать сообщение WM_PSA. Для ОДНОЙ нити этот подход не имеет смысла, поскольку в рамках нити все равно все сообщения выполняются последовательно. Ну и что что мы вернули ответ? Из процедуры обраболтки то мы не вышли, поэтому следующее сообщение из очереди не выбирается. Я полагаю, ReplyMessage(0); имеет смысл использовать в случае посылки сообщения с использованием SendMessage из одной нити в другую (это один из способов синхронизации нитей): т.е. мы отправляем сообщение с SendMessage (при этом посылающая нить приостанавливается - ждет результата), когда принимающая сообщение нить решила, что более синхронизация с нитью, отправившей ей сообщение, не нужна, она вызывает ReplyMessage(0);, получив ответ, нить, отправившая сообщение, возобновляет свою работу, в то время как вторая тоже что-то там себе делает, что -то такое, для чего не требуется синхронизация. Я еще не проверил свое предположение, но ReplyMessage(0); явно не решает задачу распараллеливания. Вот. |