Frage

Ich möchte in der Lage sein, eine TDataSet zu öffnen asynchron in einem eigenen Thread, so dass der Haupt-Thread VCL fortgesetzt werden kann, bis das erledigt ist, und haben dann den Haupt-Thread VCL von diesem TDataSet las danach. Ich habe einige Experimentieren getan und haben in einigen sehr seltsame Situationen bekommen, so frage ich mich, ob jemand zuvor getan hat.

Ich habe einige Beispielanwendungen gesehen, wo ein TDataSet in einem separaten Thread erstellt wird, es geöffnet wird und dann Daten von ihm gelesen, aber alles, was in dem separaten Thread durchgeführt. Ich frage mich, ob es sicher ist, vom TDataSet vom Haupt VCL Thread zu lesen, nachdem der andere Thread der Datenquelle öffnet.

Ich mache Win32-Programmierung in Delphi 7, mit TmySQLQuery von DAC for MySQL als mein TDataSet Nachkomme.

War es hilfreich?

Lösung

Sofern Sie nur den Datensatz in einem eigenen Thread verwenden möchten, können Sie einfach synchronisieren verwenden, um mit dem Hauptthread für jede VCL / UI-Update zu kommunizieren, wie mit jeder anderen Komponente.
Oder besser, können Sie die Kommunikation zwischen dem Mainthread und Worker-Threads mit Ihrem eigenen Messaging-System implementieren.

überprüfen Hallvard Lösung zum Einfädeln hier:
http://hallvards.blogspot.com/2008/03 /tdm6-knitting-your-own-threads.html

oder das andere:
http://dn.codegear.com/article/22411

nach einer Erklärung auf synchronize und seine Ineffizienz:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1 /Ch3.html

Andere Tipps

Ich habe es mit anderen Implementierungen von TDataSet, und zwar in den Asta Komponenten getan gesehen. Diese würden die Server kontaktieren, sofort zurück, und dann ein Ereignis ausgelöst, sobald die Daten geladen worden waren.

Aber ich glaube, es ist an der Komponente sehr viel abhängt. Zum Beispiel der gleichen Asta Komponenten nicht in einer synchronen Weise von einem anderen als der VCL-Haupt-Thread.

geöffnet werden konnten

kurz Also, ich glaube nicht, dass eine Beschränkung von TDataSet ist per se, sondern etwas, das die Umsetzung spezifisch ist, und ich habe keinen Zugriff auf die Komponenten, die Sie erwähnt haben.

Eine Sache im Auge zu behalten, um die gleiche TDataSet , um zwischen mehreren Threads verwenden, ist nur die aktuelle Datensatz zu einem bestimmten Zeitpunkt lesen. Also, wenn Sie den Datensatz in einem Thread lesen und dann die anderen Thread Anrufe Weiter , dann sind Sie in Schwierigkeiten.

Auch nicht vergessen, der Faden wird höchstwahrscheinlich eine eigene Datenbank-Verbindung. Ich glaube, was hier gebraucht wird, ist ein Multi-Threaded „Betrieb“ Objekt der Daten aus dem Thread in (nur schreiben) zu laden, die dann nur von dem Haupt-VCL-Thread gelesen. Vor dem Lesen eine Art syncronization Methode verwenden, um sicherzustellen, dass Ihr nicht im selben Moment Ihr Schreiben zu lesen, oder im selben Moment beim Lesen zu schreiben, oder laden Sie alles in eine Speicherdatei und schreiben Sie eine Sync-Methode, um den Haupt-App zu sagen, wo in der Datei aufhören zu lesen.

ich der letzte Ansatz ein paar Mal getroffen haben, auf die Anzahl der erwarteten Datensätze depdending (und die Größe des Datensatzes) Ich habe auch dies zu einem physischen Datenträger-Datei auf dem lokalen System genommen. Es funktioniert ganz gut.

Ich habe multithreaded Datenzugriff getan, und es ist nicht einfach:

1) Sie müssen eine Sitzung pro Thread erstellen.

2) Alles auf diese TDataSet-Instanz erfolgen muss in Zusammenhang mit dem Thread ausgeführt werden, wo es erstellt wurde. Das ist nicht einfach, wenn man wollte zum Beispiel platzieren ein db Raster auf es.

3) Wenn Sie zum Beispiel lassen Hauptgewindespiel mit Ihren Daten, die Straight-Forward-Lösung ist es in einen separaten Behälter irgendeiner Art sich zu bewegen, z. eine Speicherdatei.

4) Sie brauchen eine Art Mechanismus der Signalisierung Hauptthread zu benachrichtigen, sobald Ihr Datenabruf abgeschlossen ist.

... und die Ausnahmebehandlung ist nicht einfach, entweder ...

Aber: Sobald Sie erfolgreich sind, wird die Anwendung wirklich elegant sein

Die meisten TDatasets sind nicht Thread-sicher. Eines, das ich weiß, ist Thread-sicher ist kbmMemtable . Es hat auch die Möglichkeit, einen Datensatz zu klonen, so dass das Problem des Datensatzzeiger bewegt auftritt (wie von Jim McKeeth erklärt). Sie sind eine der besten Datensätze können Sie (gekauft oder kostenlos) erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top