Ich habe ein Problem mit den Threads. Ich habe ein Datenmodul auf dem ganz, ganz viele
ADO Queries sind. Diese sollen je per Thread parallel aktualisiert werden. Ich habe eine Thread-Klasse erstellt, die im Create eine DataSource bekommt und im Execute wird das
Query "einfach" geschlossen und geöffnet. Danach will ich vom Thread wissen, ob er fertig ist und wie viele Datensätze das
Query hat.
Meine Thread-Klasse:
Delphi-Quellcode:
TQThread =
class(TThread)
private
FQuery: TADOQuery;
FDataSource: TDataSource;
FIsRunning: Boolean;
FRecordCount: Integer;
function GetIsRunning: Boolean;
procedure DisableFormControls;
procedure EnableFormControls;
protected
procedure Execute;
override;
public
constructor Create(DataSource: TDataSource);
destructor Destroy;
override;
published
property IsRunning: Boolean
read GetIsRunning;
property RecordCount: Integer
read FRecordCount
write FRecordCount;
end;
constructor TQThread.Create(DataSource: TDataSource);
begin
FDataSource := DataSource;
FQuery := TADOQuery(FDataSource.DataSet);
FreeOnTerminate := True;
inherited Create(True);
end;
destructor TQThread.Destroy;
begin
FreeAndNil(FQuery);
inherited;
end;
procedure TQThread.DisableFormControls;
begin
FDataSource.DataSet.DisableControls;
end;
procedure TQThread.EnableFormControls;
begin
FDataSource.DataSet.EnableControls;
end;
procedure TQThread.Execute;
begin
inherited;
try
try
FIsRunning := True;
RecordCount := 0;
Synchronize(DisableFormControls);
FQuery.Close;
FQuery.Open;
FQuery.Last;
FQuery.First;
RecordCount := FQuery.RecordCount;
except
on Ex:
Exception do
begin
dxMessageDlg('
Fehler beim Ausführen des Query-Thead! (' + FQuery.
Name + '
, ' + Self.QualifiedClassName + '
)' + #13#10#13#10 + '
Fehlermeldung: ' + Ex.
Message + #13#10 + Ex.StackTrace + #13#10 + '
SQL: ' + FQuery.SQL.Text, mtError, [mbOK], 0);
end;
end;
finally
if not Terminated
then
begin
Synchronize(EnableFormControls);
FIsRunning := False;
end;
end;
end;
function TQThread.GetIsRunning: Boolean;
begin
Result := FIsRunning;
end;
Ich starte für jede
Query einen Thread und packe ihn in ein TDictionary, das ich in einem Timer regelmäßig prüfe, ob IsRunning True oder False ist. Wenn True, dann will ich in der
GUI die Anzahl der Datensätze ausgeben. Das passiert dann im Timer selbst. Das hat sehr lange gut funktioniert, bis ich diese Woche die
GUI umgebaut habe. Ich habe auf dem Thread die letzten Direktzugriffe auf die
GUI entfernt (es wurden eine Progressbar ein bzw. ausgeblendet und Buttons gesperrt. Das alles wird nicht mehr gebraucht.) Lasse ich nun alles laufen, bekomme ich folgenden Fehler:
Zitat:
---------------------------
GExperts Debugger
Exception Notification
---------------------------
Project crent.exe raised
exception class EOleSysError with message '
OLE-Fehler 80040200'.
---------------------------
[&Filter ...] [Ignore &All this Session] [&Break] [Additional &Info] [&Continue]
---------------------------
ThreadId=11352
ProcessId=49
ThreadName=""
ExceptionMessage="
OLE-Fehler 80040200"
ExceptionName="EOleSysError"
ExceptionDisplayName="EOleSysError"
ExceptionAddress=759D6AE2
FileName=<not available>
LineNumber=<not available>
ExceptionObject=14682200
Classes=[EOleSysError,EOleError,
Exception,TObject]
---------------------------
Und das für jeden Thread. Interessanterweise konnte ich nicht feststellen an welcher Stelle es knallt, es scheint nicht im Timer zu passieren, der Debugger hält dort nicht am Breakpoint an. Bei dem Thread habe ich mich an die "Vorlage" von Dalai (
https://www.delphipraxis.net/194264-...s-tthread.html) gehalten, da ich seinen Thread ziemlich passend fand. Habt Ihr vielleicht einen Tipp, was hier falsch läuft?