2012-03-09 6 views
3

私はアプリケーション内に同期メソッドを実装しています。それが実行されます主な手順は次のとおりですDelphiスレッドのベストプラクティス

  • は、リモートサイト
  • 解析IXMLDomDocument2
  • アップデートFirebirdのデータベース

ロジックがある非常に複雑を使用して、このXMLからXMLコンテンツを取得し、それ自体は問題なく動作しています。

問題は別のスレッド内で実行しようとするときです。私のロジックの中でスレッドの安全性が適切に得られていないことは私には明らかです。

だから、let'sスライスそれ

I - TidHTTP

Didn'tが、私はここに任意の懸念を持っている必要があり、それで問題が発生したを使用してコンテンツを取得しますか?

II - IXMLDomDocument2のために、私はthe documentationによると、安全にIXMLDomDocument2を使用するのに十分であるべき

CoInitializeEx(nil, 0); 

を呼び出しています。そしてそれはそれを追加した後、私はそれを使用しようとするときにエラーを取得していない大丈夫と思われる。余計なことはありませんか?

IIIは - 安全

私の問題はここにある火の鳥を使用します。ときどき動作しますが、時にはそれはしません(私は間違って設計されたスレッドロジックの主な症状です)。ほとんどの場合、「接続からデータを読み込む際にエラーが発生しました」というメッセージとともにEIn​​terbaseErrorが返されます。それは単純にロックします。

データベースと別に接続する必要がありますか?ウォーレンは、バックグラウンドとフォアグラウンドスレッドとの間の接続を共有するの主な問題を釘付け

+10

とペアにする必要はないはずバックグラウンドスレッドとフォアグラウンドスレッドの間のDBへの接続を共有します。 –

+3

私はウォーレンに同意します。それがデータベースの場合、特定のDBエンジン(およびそのVCLコンポーネント)がスレッドセーフであるという事実を知らない場合は、スレッド境界を越えてDBコンポーネントを共有しないでください。各スレッドに独自の接続とそれ自身のloal DBコンポーネントのセットを与えます。それ以外の場合は、必要に応じて他のスレッドが要求を送信できる専用スレッドにDBロジックを移動します。 –

+2

ウォーレンとレミーありがとうございました。私はsepparate接続を作成しました、そして、それは今すべてです。しかし、私は私の質問をして、私が持っていなければならない他の懸念があるかどうかを見ます。あなたの答えは –

答えて

2

...あなたは別の問題があり、それがCoInitializeをへのすべての呼び出しで間違いCoUninitializeの

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

+0

+1です。私は本当にCoUninitializeを呼び出さないと問題を抱えていました。しかし、それを呼び出すことは私の問題を解決しませんでした。それを呼び出すかどうかは、スレッドへの呼び出しの後に同じ不十分なメモリの問題を引き起こします。私は問題がcoInitializeであると確信しています。 –

関連する問題