Делфи нить лучшие практики - PullRequest
3 голосов
/ 10 марта 2012

Я реализую метод синхронизации внутри моего приложения. Основные шаги, которые он выполнит:

  • Получение содержимого XML с удаленного сайта
  • Разобрать этот XML с помощью IXMLDomDocument2
  • Обновление базы данных Firebird

Логика довольно сложная, но сама по себе она отлично работает.

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

Итак, давайте нарежем это

I - Получить контент, используя TidHTTP

У меня не было с этим проблем, у меня тут какие-то проблемы?

II - Для IXMLDomDocument2 Я звоню

CoInitializeEx(nil, 0);

, что согласно документации должно быть достаточно для безопасного использования IXMLDomDocument2 . И, кажется, все в порядке, после добавления я не получил никакой ошибки при попытке использовать его. Есть ли здесь что-то еще?

III - Для безопасного использования Firebird

Мои проблемы здесь. Иногда это работает, иногда нет (что, я думаю, является основным признаком плохо разработанной логики потоков). Большую часть времени я получаю EInterbaseError с сообщением «Ошибка чтения данных из соединения». В других случаях он просто блокируется.

Должен ли я иметь отдельное соединение с базой данных?

1 Ответ

2 голосов
/ 24 марта 2012

Уоррен преуменьшил основную проблему с разделением соединения между фоновым и передним потоком ... у вас есть другая проблема, и каждый вызов CoInitialize должен быть связан с CoUninitialize

http://msdn.microsoft.com/en-us/library/windows/desktop/ms688715(v=vs.85).aspx

...