Используя Delphi 7 & UIB, я выполняю операции с базами данных в фоновом потоке, чтобы устранить такие проблемы, как:
- Тайм-аут
- Приоритет
- Немедленное принудительное переподключение после потери сети
- Неблокированный пользовательский интерфейс
- Сохранение открытого соединения с БД
- Отмена пользователя
Я прочитал ВСЕ связанные темы здесь и понял: использование while isMyThreadStillRuning and not UserCanceled do sleep(100); end;
не рекомендуемый способ сделать это, а скорее использование TEvent.WaitFor(3000)...
.
Решения здесь либо об отправке сигналовОТ или ДО ... потока, или , делающего это с сообщениями , но никогда не в обоих направлениях.
Читая файл справки, я также нашел TSimpleEvent
, который, кажется, проще в использовании.
Так каков рекомендуемый способ связи между Main-UI + DB-Thread в обоих направлениях?
Должен ли я просто создать 2 + 2 TSimpleEvent
?
- , чтобы начать новую транзакцию (поток должен прекратить спать)
- принудительное выполнение STOP
- , чтобы дать сигнал в случае его перехода на новый этап (транзакция началась /выполнено / передано = выполнено)
- для возврата в случае возникновения ошибки
или должно быть только 1 TEvent
?
Обновление 2:
Первые тесты показывают:
- 2x
TSimpleEvent
достаточно (1 для Thread + 1 для Gui) - Оба созданыв качестве открытых свойств фонового потока
- принудительное завершение потока не работает. (Слишком много ошибок невозможно обработать ..)
- Лучше установить переменную типа (Stop_yourself) и позволить ей отменять и освобождать себя, (при создании нового экземпляра изтот же класс и попробуйте еще раз.)
- (работа еще продолжается ...)