Самым простым должно быть определение некоторых пользовательских сообщений , а затем отправка их из подпотоков в основной поток.
Это совершенно поточно-ориентированный и даже процессно-безопасный.
Используйте PostMessage()
с ручкой основной формы.Но не транслируйте это WM_USER+n
сообщение всему пользовательскому интерфейсу, потому что вы можете перепутать некоторую часть VCL, которая определяет его собственные пользовательские сообщения.
Если вы хотите скопировать некоторые текстовые данные по потокам или процессам,Вы можете увидеть WM_COPY_DATA
.На практике это очень быстро, быстрее, чем именованные каналы для небольших сообщений.
Для пользовательского интерфейса я обнаружил, что реализация без сохранения состояния иногда является хорошей идеей.То есть вы не перезваниваете основной поток с помощью вызова Synchronize()
или сообщения GDI, но ваш основной поток графического интерфейса имеет таймер, который проверяет буфер общей памяти на наличие ожидающих обновлений.Вот как работает веб, и на практике с ним довольно легко работать: вам не нужно писать обратный вызов, каждый поток независим, выполнять свои функции и обновлять при необходимости.
НоКонечно, решение зависит от конкретной архитектуры проекта.
Для простой, но проверенной библиотеки см. AsyncCalls , от Delphi 5 до XE.Для получения последних версий среды IDE (Delphi 2007 и более поздних версий) ознакомьтесь с OmniThreadLibrary .Используя такие библиотеки, вы гарантируете, что ваша программная реализация нигде не сломается: в большинстве случаев многопоточное приложение работает, как ожидается, большую часть времени, а затем по неизвестным причинам входит в бесконечный цикл.И, конечно, это происходит только на стороне клиента, а не на вашей ... Если вы не хотите часами отлаживать свою программу, просто доверьтесь проверенным библиотекам, которые, как известно, хорошо разработаны и отлажены.