Hallo zusammen,
ich habe eine Anwendung, die im Prinzip so aufgebaut ist:
Code:
PseudoCode
sqltext:=GetSQLText;
if chk(sqltext) then Querythread;
:EndofQuery
case outtype of
file: ReadQuerytoFile(filename);
grid: ReadQuerytoGrid(self.Grid1);
text: ReadQuerytoMemo(self.Memo1.Lines);
:EndofReader
curser:=cursordefault;
(Ist stark vereinfacht)
ReadQuerytoGrid ruft selber eine procedure auf, die die Daten aus der
Query in ein TStrings kopiert. Das sah im Prinzip so aus:
Code:
mystrings.beginupdate;
while not
query.eof do begin
mystrings(add(
query.fieldbyname(Feld).asstring);
query.next;
end;
mystrings.endupdate;
Im Prinzip funktioniert das auch, wenn ich keine Textausgabe nutze. Dann wird die Ausgabe zu einem Glücksspiel.
Mal werden die Daten übernommen aber nicht angezeigt- sieht aus wie
TMemo.visible=false;
oder aber manchmal bekomme ich ein "ungültiges Fensterhandle" zurück.
Ebenso kann es sein, daß die Übernahme angezeigt wird und die Ergebnisse auch sichtbar sind.
Zum Testen habe ich den BeginUpdate/EndUpdate-Rahmen immer weiter vergrößert, aber das Verhalten bleibt gleich unberechenbar.
z.Zt bin ich bei:
Code:
sqltext:=GetSQLText;
if chk(sqltext) then begin
Memo1.lines.Beginupdate;
Querythread;
:EndofQuery
case outtype of
file: ReadQuerytoFile(filename);
grid: ReadQuerytoGrid(self.Grid1);
text: ReadQuerytoMemo(self.Memo1.Lines);
:EndofReader
Memo1.Lines.Endupdate;
curser:=cursordefault;
Meine nächste Maßnahme wäre, Die Ergebnisse in eine "externe" Stringlist/Strings/String zu schreiben und diese dann in das Memo zu kopieren. Auf diese Weise sollten sich die beiden Threads nicht in die Quere kommen. Was mich daran stört, ist der hohe Speicherverbrauch, und daß der Zugriff auf das Stringgrid aus dem ReaderThread heraus problemlos funktioniert.
Oder suche ich u.U. am falschen Ort nach der Fehlerursache?
Ich hoffe das ist nicht zu wirr und vielen dank für's lesen.
Gruß
K-H