Можете ли вы получать события во вторичном потоке в Delphi XE? - PullRequest
5 голосов
/ 06 июля 2011

Я хотел бы иметь три потока в примере приложения.
Тема № 1 (Основная тема) - Пользовательский интерфейс / GUI
Поток № 2 - привязан к устройству с последовательным портом, получающему данные через события, передаваемые в очередь данных.
Поток № 3 - активируется при создании записи в очереди, обрабатывает узел данных, освобождает объект данных.

Цель состоит в том, чтобы
а) Предотвратите потерю данных, когда кнопка или форма удерживаются мышью на главной форме.
б) Быстро получить данные о событии, поместить их в очередь, вернуться в режим сна
c) Обрабатывать данные, когда они у нас есть, иначе спать.

Могут ли пакеты типа AsyncoPro связать обработку событий с неосновным потоком?

Я никогда не делал много с приложениями, управляемыми событиями последовательного порта, большая часть того, с чем я работаю, опрашивается, и я хочу провести некоторое тестирование.

Ответы [ 3 ]

6 голосов
/ 06 июля 2011

Вы определенно можете связать обработку событий с неосновным потоком. Чего вы не можете сделать, так это связать обновление экрана с неосновной веткой. Windows API не является поточно-ориентированным, и Delphi VCL, построенный поверх Windows API, также не является. Но ваш дизайн в основном хорошая, работоспособная идея; просто не забудьте использовать Synchronize или Queue методы TThread для отправки любых обновлений пользовательского интерфейса для выполнения в главном потоке.

5 голосов
/ 06 июля 2011

Самым простым должно быть определение некоторых пользовательских сообщений , а затем отправка их из подпотоков в основной поток.

Это совершенно поточно-ориентированный и даже процессно-безопасный.

Используйте PostMessage() с ручкой основной формы.Но не транслируйте это WM_USER+n сообщение всему пользовательскому интерфейсу, потому что вы можете перепутать некоторую часть VCL, которая определяет его собственные пользовательские сообщения.

Если вы хотите скопировать некоторые текстовые данные по потокам или процессам,Вы можете увидеть WM_COPY_DATA.На практике это очень быстро, быстрее, чем именованные каналы для небольших сообщений.

Для пользовательского интерфейса я обнаружил, что реализация без сохранения состояния иногда является хорошей идеей.То есть вы не перезваниваете основной поток с помощью вызова Synchronize() или сообщения GDI, но ваш основной поток графического интерфейса имеет таймер, который проверяет буфер общей памяти на наличие ожидающих обновлений.Вот как работает веб, и на практике с ним довольно легко работать: вам не нужно писать обратный вызов, каждый поток независим, выполнять свои функции и обновлять при необходимости.

НоКонечно, решение зависит от конкретной архитектуры проекта.

Для простой, но проверенной библиотеки см. AsyncCalls , от Delphi 5 до XE.Для получения последних версий среды IDE (Delphi 2007 и более поздних версий) ознакомьтесь с OmniThreadLibrary .Используя такие библиотеки, вы гарантируете, что ваша программная реализация нигде не сломается: в большинстве случаев многопоточное приложение работает, как ожидается, большую часть времени, а затем по неизвестным причинам входит в бесконечный цикл.И, конечно, это происходит только на стороне клиента, а не на вашей ... Если вы не хотите часами отлаживать свою программу, просто доверьтесь проверенным библиотекам, которые, как известно, хорошо разработаны и отлажены.

1 голос
/ 06 июля 2011

Конечно, вы можете сделать это, так или иначе. Не используется Apro с D5 - Apro, который у меня есть, не работает на моем D2009 (проблемы с Unicode / string / ANSIstring), и у меня есть свои собственные серийные классы. Большинство доступных последовательных компонентов имеют возможность запуска событий dataRx либо в потоке rx, либо в главном потоке графического интерфейса - очевидно, в вашем случае вам следует выбрать поток rx (Поток № 2). Перенесите данные rx в некоторый буферный класс и поместите их в поток производителя-потребителя в (поток № 3). Обработайте это там. Если вам нужно выполнить обновление GUI оттуда, PostMessage ссылается на поток GUI и обрабатывает его в пользовательской процедуре обработки сообщений.

Сделано такое время загрузки - все будет хорошо.

Rgds, Martin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...