Delphi Thread PostMessage, SendMessage, ReplayMessage

tvv 08.04.2004 - 12:59 | Вот возникла задача нужно из дополнительного потока заставить основной поток выполнить обновление данных. При этом желательно чтобы дополнительный поток не ждал завершения обновления в основном потоке. По этому метод потока Synhronize, не подходит. Вот возникла идея использовать функцию PostMessage, в которой передавать результат операции и указатель на объект, который в основном потоке должен этот результат обработать. Но PostMessage в отличие от SendMessage помещает сообщение в очередь сообщений приложения и следовательно обновление будет происходить не сразу, что тоже не хорошо. Тогда возникла идея использовать функцию SendMessage, а в обработчике этого сообщения в основном потоке сразу вызывать функцию ReplayMessage, а потом производить обработку и отображение результатов на форме и запись в БД. Но вот не уверен, а можно ли из такого обработчика сообщения работать с VCL объектами, и должен ли код этого обработчика быть реентерабельным. И что будет, если поток пошлет очередное сообщение, а мы еще не завершили обработку предыдущего сообщения.
VaS 1 - 08.04.2004 - 14:27 | SendMessageCallback. Повторный вход исключи флагом на уровне оконной процедуры или кр. секцией на уровне вызова самой SendMessageCallback. Флаг сбрасываешь в колбэке, передаваемом в SendMessageCallback. Есть вероятность, что дополнительный поток будет ждать обработки предыдущего сообщения. Если нежелательно, то надо заводить потокобезопасную очередь, в которую в дополнительном потоке помещать объекты-задания. Очередь разгребаем в главном потоке. Но это ничем не отличает от PostMessage.
tvv 2 - 08.04.2004 - 16:49 | А все же разве может быть повторный вход в обработчик сообщений при SendMessage, если в обработчике сразу вызывается ReplayMessage, т.е. иными словами оконная процедура по-моему выполняется в основном потоке, и если в обработчике ни кто не вызовет что нибудь типа Application.ProcessMessages, то обработка не будет прервана и если дополнительный поток пошлет очередной SendMessage, то он будет приостановлен до тех пор пока не завершится обработка предыдущего SendMessage. Так же пока идет обработка этого сообщения так же не будут обрабатываться сообщения из очереди сообщений. Иначе оконная процедура должна выполняться в отдельном потоке, а не в основном. Или я заблуждаюсь.

>>