Több szálon futás

Több szálon futás
2018-07-25T16:01:01+02:00
2018-07-27T03:18:55+02:00
2022-08-11T05:15:30+02:00
KöveZoli
Sziasztok,

Elkezdtem átalakítani a programomat több szálasra (ez az első próbálkozásom) - egy régebbi bejegyzésben kapott tanácsra hivatkozva -, mivel nem válaszol a program, ha valami mást is csinálok (a műveletet elvégzi, csak nem válaszol).

Amit eddig tettem:
- Nyitottam egy új pas file-t (Thread Object) a Tool Palette segítsésével.
- Az Execute procedurába beillesztettem a leválogatási feladatot (2 adatbázis tábla összehasonlítása majd szétválogatása két másik táblába - sima táblaműveletekkel, GBGridekben megjelenítve)
- A mainformon egy gombhoz hozzárendeltem a szál meghívását

procedure TForm1.LevalogatasClick(Sender: TObject); begin if mrOK=MessageDlg('....',mtInformation,[mbOK,mbCancel],0) then begin with levalogatas.Create(false) do begin FreeOnTerminate:=true; end; end; end;
El is indul, de sajnos Access Violation ablakok sora nyílik meg (általában 5-6 db), majd egyszer csak a leválogatás megáll.
Mi lehet a probléma? Kihagyok valamit? 

Köszönöm!
Mutasd a teljes hozzászólást!
Mutasd a teljes hozzászólást!

  • Sosem szálaztam Pascal/Delphi-ben, de natív környezetekben (és nagyon gyakran nem-natívokban is) az az egyik alapszabály, hogy háttérszálból a felhasználói felülethez közvetlenül nem nyúlhatsz. Vagy üzeneteket kéne küldened és akkor menet közben is megjelenhetnek részeredmény, vagy amikor a szál kilép, akkor egy lépésben kitenni az eredményeket (ekkor persze menet közben nem látszik semmi), szintén a grafikus felületet kezelő szálból érzékelve a háttérszál kilépését (erre szokott lenni valamilyen esemény).
    Mutasd a teljes hozzászólást!
  • Éppen írni akartam, de már nem tudtam szerkeszteni a bejegyzést.
    Nem emlékeztem, hogy ilyen kérdésem volt már. Most kicsit másképp álltam hozzá, de a probléma ugyanaz.
    Mutasd a teljes hozzászólást!
  • Ezek szerint akkor akár az is lehet a gond, hogy a táblák adatai folyamatában a DBGridben megjelennek.
    Mondjuk nem fontos, hogy lássam futni a táblákban az adatokat, ráér a végén megjelenni.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Azt próbáltam, hogy a procedure levalogatas.Execute-ban  betettem a táblaműveleteket 
    Synchronize (procedure begin  ..... end) közé, de ez esetben ugyanúgy nem válaszol a program, ha elkattintok máshová.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Én nem tudok pascal/delphi nyelven, de minden bizonnyal a synchronized-dal megfogtad az egészet, amíg a szál nem terminál. Ez így kb. hasonló eredmény lehet, mintha nem is raktad volna külön szálba.

    Ki kellene deríteni, hogy igazából mi a lassú.

    Ha pl. az SQL lassú, és a control frissítés gyors, akkor csak a lekérdezést kellene külön szálon eldurrantani, majd ha végzett, akkor egy szinkronizált "blokkban" frissíteni a control-(oka)t a lekérdezés eredményével (ha van valami callback-lehetőség, ami a szál lefutása után az UI threaden hívódik meg, akkor az is jó lehet a vizuális elemek frissítésére).

    Ha a control frissítés lassú, akkor X soronként valami ProcessMessages-szerűség is segíthet.
    Mutasd a teljes hozzászólást!
  • Szia !
    Régen én is csináltam szálprogramozást, de kukkot sem értettem hozzá.
    Be copy-tam a teljes szál kódját, és kiderült 1000 sebből vérzik.
    Javaslom te is tedd meg, úgy jobban látszik mit csináltál, hol lehet a hiba.
    (Persze csak ha nem valami titkos progit készítesz a "názának" :) )
    Az itt lévő srácok, simán kiszúrták a hibákat, javítottam őket, és sokat tanultam !
    Én például, nem látom az általad beírt kódban, hogy a Tthread típusból hol hoztál létre egy változót.
    (Lehet meg tetted már valahol...)
    Valami ilyesmire gondolok:

    procedure TForm1.LevalogatasClick(Sender: TObject); var levalogatas: TlevalogatasSzal; //Ez a szálad ! begin if mrOK=MessageDlg('....',mtInformation,[mbOK,mbCancel],0) then begin levalogatas:= TlevalogatasSzal.create(false); levalogatas.FreeOnTerminate:=true; end; end;
    Aztán ha valami paramétert adsz át a szálnak, azt sem mindegy hol teszed.
    Sok sikert !
    Mutasd a teljes hozzászólást!
abcd