メインスレッドから生成された複数のサブスレッド内で
それぞれ動的にTADOConnectionクラス、TADOQueryクラスの
インスタンスを生成し、サブスレッド内でDBサーバの更新処理を
行おうと考えています。
スレッド内でTADOConnectionクラス及びTADOQueryクラスのインスタンスを
生成(Create)しようとすると
「プロジェクト〜は、例外クラスEOleSysError(メッセージ'CoInitializeは
呼び出されていません。')を送出しました。」
の例外が発生します。
インスタンス生成部分を別関数にし、Synchronize()でくくってその関数を
コールすると例外は発生しません。
ただ、その場合でもその後TADOConnection、TADOQueryのインスタンスにアクセスする箇所
全てで上記エラーが発生するので、それら全てをSynchronize()でくくって
しまう必要があり、それだと、スレッド処理にした意味がないのかなと思っています。
(Synchronizeはメイン(画面)のコンテキストで処理を行う?から)
TADOConnectionクラス、TADOQueryクラスをスレッド内で動的に
インスタンスを生成し、動作させることはできないのでしょうか?
※同時に複数の処理を行う必要があり、同時に複数のSQL文発行を行いたい為、
スレッドを複数たて、そのスレッド内でSQL文の発行をと考えています。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
//*********************************
// スレッドクラス(TThreadそのままです)
//*********************************
TThreadTest = class(TThread)
protected
procedure Execute; override;
end;
var
Form1: TForm1;
Thread1: TThreadTest;
//******************************
// ボタン押下でスレッド起動する
//******************************
procedure TForm1.Button1Click(Sender: TObject);
begin
Thread1 := TThreadTest.Create(True);
Thread1.Resume;
end;
//********************
// スレッドメイン関数
//********************
procedure TThreadTest.Execute;
var
ConDB: TADOConnection;
SQLQuery: TADOQuery;
begin
ConDB := TADOConnection.Create(nil); // ←例外発生
ConDB.Connected := True;
SQLQuery := TADOQuery.Create(nil);
SQLQuery.Connection := ConDB;
while not Terminated do
begin
// SQLQuery処理
end;
SQLQuery.Free;
ConDB.Free;
end;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
エラーメッセージにもあるとおりCoInitializeが必要です。
http://www.borland.co.jp/delphi/papers/com/com05.html
えーとさんありがとうございます。
紹介いただいたサイトがそのものずばりでした。
内容を全て把握できたわけではないのですが、
CoInitializeのコールで例外が発生しなくなりました。
ありがとうございました。
ツイート | ![]() |