Imam program u D2007 koji radi OK, a sinhronizira podatse local.FB -> web.MySQL. Nekliko različitih vrsta sinronizacija koje rade u zasebnim thread-ovima.
Sada to pokušavam napraviti u XE7 sa task-ovima. Konekcije na lokanu bazu i na onu na webu se rad s TFDConnection. Svaki task kreira svoju konekciju i kontrole za pristup podacima.
Ovo je primjer onoga što pokušavam:
procedure TfmMain.Button1Click(Sender: TObject);
begin
tt[1] := TTask.Create (procedure ()
var a1: tMyThreadAdresar; // ovo i Create sam pokušao staviti i van TTask-a
begin
a1 := tMyThreadAdresar.Create(fmMain);
a1.MainProcedure := CountActivThread; // proc u main formi, iz a1.Execute se poziva s parametrom integer koji se zbraja na var UKUPNO. Na početku procedure +1, a na kraju -1.
// Procedura pri parametru -1 provjerava da li je UKUPNO = 0, pa ako je ispiše "Gotovo"
a1.Log := self.Log; // TListView - prikazuje log posla. U Threadu se koristi Synchronize za upis u ListView.
a1.Params := Param; // Param je objekt koji sadrži parametre za spajanje na baze itd. definiran u main thread-u, ne mijenjam ga u objektu "a1" samo čitam
a1.Name := 'a1';
a1.Execute; // methoda koja obavlja sinhronizaciju
end);
// slijede još 3 ista, s tim da su a2, a3 i a4 varijable
tt[2] := ...
tt[3] := ..
tt[3] := ..
tt[1].Start;
tt[2].Start;
tt[3].Start;
tt[4].Start;
while not TTask.WaitForAll(tt, 1) do begin
CheckSynchronize(0);
Application.MainForm.Update;
Application.ProcessMessages;
end;
end;
u "a1" se:
- otviri FB baza i MySQL baza, ptrotrči kroz jednu od tablica na webu i u FB.
- kreira progressbar koji se prikazuje na main formi i pokazuje
Gdje griješim? Program javlja greške od Access Violation... na dalje, kako kad. Ponekad s izvrti do pola pa zablokira, ponekad završi ali kod gašenja ostane "visjeti" u task manager-u.