Как синхронизировать событие Delphi при выполнении операций с БД в фоновом потоке? - PullRequest
0 голосов
/ 19 сентября 2019

Используя 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) и позволить ей отменять и освобождать себя, (при создании нового экземпляра изтот же класс и попробуйте еще раз.)
  • (работа еще продолжается ...)

1 Ответ

1 голос
/ 19 сентября 2019

Вы должны переместить запрос в TThread.К сожалению, анонимные потоки недоступны в D7, поэтому вам нужно написать собственный класс TThread.Внутри вам нужно собственное соединение с БД для предотвращения общих ресурсов.Из метода вызывающей стороны вы можете дождаться окончания потока.Результаты должны храниться где-то в классе вызывающего.Убедитесь, что доступ к параметрам запроса и для сохранения результата запроса обрабатывается потокобезопасно с помощью TMutex или TMonitor.

...