OmniThreadLibrary определенно может помочь вам здесь. Тест 5 из дистрибутива OTL должен помочь вам начать.
В этой демонстрации кнопка «Пуск» создает поток и устанавливает некоторые параметры и таймер (которые вы можете удалить в своем коде, если они не нужны). «Change message» посылает сообщение в поток, и это сообщение обрабатывается в методе OMChangeMessage потока. Затем поток отправляет некоторую информацию обратно клиенту (OMSendMessage в этой демонстрации, но вы можете сделать это в том же сообщении, в котором будете выполнять свою работу), и главный поток получает это сообщение через компонент OmniEventMonitor. Кнопка «Стоп» останавливает рабочий поток.
Если поступит больше сообщений, когда ваш поток занят, они будут помещены в очередь и обработаны, как только ваш рабочий метод завершит свою работу. Когда делать нечего, поток будет ждать следующего сообщения, используя ноль циклов ЦП в процессе.
EDIT
В Delphi 2009 и выше шаблон Background Worker предоставляет более простое решение.