2017-01-24 35 views
0

私はデータベースを探索するための検索コードを書いています。クエリは単独で動作するので、私はスレッドを使用しました。デルファイのスレッドエラー

このスレッド(このウェブサイトのユーザーの1人が書かれています)は、多くのエラーを示しています。

コード:

procedure TForm1.QueryFinished(Sender: TObject); 
begin 
    if TThread(Sender).FatalException <> nil then 
    begin 
    // something went wrong 
    on E : Exception do 
    begin 
     MLog.Lines.Add('Exception class name = '+E.ClassName); /// MLog is Memo For Log 
     MLog.Lines.Add('Exception message = '+E.Message); 
    end; 
    exit; 
    end; 
    MLog.Lines.Add('Search is Done!'); 
end; 

procedure TForm1.Requery; 
var 
    Thread: TThread; 
begin 
    Thread := TThread.CreateAnonymousThread(
    procedure 
     begin 
     query.close; 
     query.sql.text:='select * from Customer where CustomerID LIKE "%'+Form1.edit1.text+'%"'; 
     query.open; 
     end); 
    Thread.OnTerminate := QueryFinished; 
    Thread.Start; 
end; 

エラー1:

プロジェクトproject1に:

プロジェクトProject1.exeのは

エロ2 'テキストが見つかりませんでした' というメッセージと例外クラスEEvaluatorErrorを上げました.exeは、メッセージ 'EvalError LinkControlToField6で例外クラスEEvaluatorErrorを発生しました:テキストが見つかりません'

EvalError」というメッセージと

プロジェクトのProject1.exe発生した例外クラスEBindCompError中:

エラー3:

エラー4

プロジェクトのProject1.exe発生した例外クラスEArgumentOutOfRangeExceptionメッセージで '範囲外の引数' LinkControlToField2:モジュールのアドレス5005FC08でアクセス違反 'rtl230.bpl' アドレスの読む000000D0'

エラー5:

モジュール 'FireDACCommon230.bpl'のアドレス006CE2BFのアクセス違反00000004

この問題を解決するにはどうすればよいですか?

多分私はスレッドを終了する必要があります。 スレッドがTerminate権を持っていることをどのように知ることができますか?

+2

を私たちは何も 'query'を知っています。 [Mcve]。 –

+0

スレッドのコンテキストで接続とクエリを作成する必要があるため、これは機能しません。そして、クラス自体にすでに入っているときにフォーム変数を使用しないでください。 – whosrdaddy

+1

スレッドについては忘れてしまいます。非同期データベース操作(内部的にスレッドを使用します)が必要です。 [Documentation](http://docwiki.embarcadero.com/CodeExamples/en/FireDAC.TFDQuery.Async_Sample)を参照してください。 – whosrdaddy

答えて

0

検索を高速化するには、非同期方式を使用する必要があります。

Delphiで多くの例がありますが、例えば、コンピュータに次のアドレスにアクセスしてください:

C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Async 

は、プロジェクトを実行し、そのパターンを取ります。

または、以下のリンクをお読みください。

Asynchronous Execution

Cancel an Asynchronous

+1

ああ、とても良い@ A.K、ありがとう –