Как улучшить производительность с помощью многопоточности? - PullRequest
4 голосов
/ 31 января 2012

У меня есть программа, которая получает строковые сообщения от других приложений и анализирует их с помощью VCL. Сообщения отправляются следующим образом:

AtomId := GlobalAddAtom(PChar(s));
SendMessage(MyProgramHandle, WM_MSG, 0, AtomID);
GlobalDeleteAtom(AtomID);

Моя программа получает это сообщение, некоторое время анализирует его, а затем возвращает управление приложению. Для анализа одного сообщения требуется время, поэтому производительность других приложений ухудшается.

Одним из возможных решений является создание формы с таким же заголовком и тем же классом в другом потоке и переименование класса основной формы. Но, насколько мне известно, не рекомендуется создавать формы в потоках.

Итак, каковы возможные способы улучшения производительности?

Ответы [ 2 ]

6 голосов
/ 31 января 2012

Типичный подход заключается в создании рабочего потока (или пула рабочих потоков). Основной поток продолжит получать сообщения, но вместо их анализа он просто добавит их в очередь (например, в связанный список).

Рабочий поток берет первый элемент в очереди и обрабатывает его. После этого он возвращается в очередь, чтобы получить следующий элемент.

Поскольку очередь является общим ресурсом для нескольких потоков, вам необходимо контролировать доступ к нему. Мьютекс гарантирует, что только один поток получит доступ к очереди в любой момент времени.

Удачи.

2 голосов
/ 31 января 2012

Итак, проблема в том, что как получение сообщений, так и операции VCL выполняются в одном и том же потоке 1002 * (основной поток VCL)?Итак, получение и обработка сериализуются, и в результате отправители блокируются, пока ваше приложение занято заполнением сетки?Тогда я могу понять, что вы запрашиваете способ переместить прием в другой цикл сообщений окна.

Таким образом, я бы создал окно (не форму VCL) только для цели получения сообщений и использования его цикла сообщений для добавления сообщения в очередь.Так что вам нужно только найти это (не VCL) окно и SendMessage к его дескриптору.В потоке VCL таймер может получить следующие «n» сообщения и добавить их в таблицу.

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