На мой взгляд для этих целей проще использовать
обычный таймер.
Поиск запустить в одном отдельном потоке, и оттуда ставить таймер, указав обработчик. Через
synchronize, разумеется. По истечение таймаута в главном потоке вызовется обработчик, который сделает всё, что нужно.
Ну или создавать делфийский объект "таймер", ставить ему значение и обработчик, и по завершении удалять его.
Или - проще, но не особо точно по времени: при "нахождении" чего-то добавить в список структуру, содержащую то, что надо удалить, и таймаут. Далее просто по повторяющемуся таймеру Delphi каждую условно секунду вычитать 1 из таймаутов всех элементов списка, а когда значение элемента достигло нуля - удалять. Ну и обмазать всё это синзронизацией, разумеется.
Почему эти два подхода лучше - главный поток не висит, а значит - приложение не "зависает". Ну и не плодятся бесполезные потоки, которые только и делают, что Sleep.