Обработка на набор от данни в нишка
Пиша клас, има свойство свойство DS: TDataSet чете GetDS записва SetDS; след това, за да сортирам в отделна нишка, създавам TClientDataSet, копирам всичко там. За да позволите на потребителя да промени набора от данни, е възможно да стартирате друга нишка.
procedure TWEThread.SetDST(const Value: TDataSet); var i: Integer; BM: TBookmark; започнете ако Value.IsEmpty тогава повдигнете Exception.Create("TDataSet е празен"); FDST := TClientDataSet.Create(нула); FDST.FieldDefs.BeginUpdate; FDST.FieldDefs := Value.FieldDefs; FDST.FieldDefs.EndUpdate; FDST.CreateDataSet; FDST.DisableControls; BM := Value.GetBookmark; Value.DisableControls; докато не (Value.Eof) направете започнете FDST.Insert; за i := 0 до Value.FieldCount - 1 направете FDST.Fields[i].Value := Value.Fields[i].Value; FDST.Post; Стойност.Напред; край; Value.EnableControls; Value.GotoBookmark(BM); FDST.Първо; Звуков сигнал; край;
тези. след това някъде в нишката в Execute while not(FDST.Eof) do begin Work; FDST.Напред; край;
въпросът е .. докато данните се копират, времето минава, наборът може да се промени Какво ще се случи с копието е страшно да се предположи
ADO има метод Clone. Не го намерих в ODAC. Ползваме и UniDAC, още не съм го гледал.
Как да клонирам DataSet за моите цели? ИЛИ трябва изцяло да променя подхода си? Кое?
Но няма да е възможно да се обработи клонираният набор от данни в друга нишка.
През SQL INSERT/UPDATE няма да се търкаля? На моменти по-бързо и без потоци.
Копирането на набор от данни се извършва най-добре не чрез груба сила, а чрез запазването му в поток и зареждането му в нов.
> докато данните се копират, времето минава, наборът може да бъде > промененоСвойство за достъп DS: TDataSet защити критичната секция, илиTMultipleReadExclusiveWriteSynchronizer
Какво се случва Данните не е ясно от коя база данни, не е ясно предварително. Но компонентите, които ги съдържат, са съвместими с TDataSet. Копирам данните в създадения точно там ClientDataSet и работя с него. Не разбирам къде да ВМЪКНА/АКТУАЛИЗИРАМ?
> Достъп до свойството DS: TDataSet защитава с критична секцияИ аз мисля така
> запазване в поток и качване в нов.точно. ще опитам сега..
> Данните са получени от неясно от коя база данни, не е ясно предварително
Какво значение има откъде идват? Създавате заявка - след това в транзакция я изпълнявате. За какво да влачите потоци?
> докато данните се копират, времето минава, наборът може да бъде > променен > Какво ще се случи с копието е страшно да се предположи
Ето един начин за бързо копиране на данни в TClientDataSet: