2017-01-24 16 views
0

Ich habe einen Suchcode geschrieben, um die Datenbank zu erkunden. Da die Abfrage alleine wirkt, habe ich den Thread verwendet.Thread Fehler in Delphi

Jetzt gibt dieser Thread (einer der Benutzer auf der Website geschrieben) eine Menge Fehler.

Code:

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; 

Fehler 1:

Projekt project1.exe angehoben Ausnahmeklasse EEvaluatorError mit der Meldung 'Could not Text finden'

Erro 2:

Projekt project1 .exe ausgelöst Ausnahmeklasse EEvaluatorError mit der Nachricht 'EvalError in LinkControlToField6: Konnte Text nicht finden'

Fehler 3:

Projekt project1.exe angehoben Ausnahmeklasse EArgumentOutOfRangeException mit Meldung 'Argument außerhalb des Bereichs'

Fehler 4:

Projekt project1.exe angehoben Ausnahmeklasse EBindCompError mit Meldung ‚EvalError in LinkControlToField2: Zugriffsverletzung bei Adresse 5005FC08 in Modul 'rtl230.bpl' lesen der Adresse 000000D0'

Fehler 5:

Zugriffsverletzung bei Adresse 006CE2BF im Modul 'FireDACCommon230.bpl' Adresse lesen 00000004

Was kann zur Lösung dieses Problems getan werden?

Vielleicht sollte ich nur meinen Thread beenden. Woher weiß ich, dass ein Thread das Recht Beenden hat?

+2

Wir wissen nichts 'query'. [McVe] –

+0

Dies funktioniert nicht, da Sie die Verbindung und Abfrage im Kontext des Threads erstellen müssen. Und verwenden Sie die Formularvariable nicht, wenn Sie bereits in der Klasse selbst sind ... – whosrdaddy

+1

Vergessen Sie den Thread, was Sie benötigen, sind asynchrone Datenbankoperationen (die intern einen Thread verwenden). Lesen Sie die [Dokumentation] (http://docwiki.embarcadero.com/CodeExamples/en/FireDAC.TFDQuery.Async_Sample) – whosrdaddy

Antwort

0

Um Ihre Suche zu beschleunigen, sollten Sie die Async-Methode verwenden.

Es gibt viele Beispiele in Delphi, zum Beispiel, gehen Sie an die folgende Adresse zu Ihrem Computer:

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

Führen Sie das Projekt und das Muster nehmen.

Oder lesen Links unten:

Asynchronous Execution

Cancel an Asynchronous

+1

Oh, Sehr gut @ A.K, Danke –