Wykorzystanie w wątku procedury z innego modułu

0

Witam,

zapoznałem się podstawami wątków w Delphi i napisałem już kilka programów obsługujących wątki. Jednak od rana mam pewien problem którego nie potrafię rozwiązać.

Piszę sobie moduł w którym znajdą się najczęściej używane przeze mnie procedury i funkcje. Wśród nich jest procedura, która będzie odpowiadać za przewijanie się tekstu (pojedyńczej linii). Oto ona:

procedure RS.PrzewijajLinieTXT(zrodlo, cel: String; czestotliwosc: word = 200);
var
  licznik: integer;
begin
licznik := 0;
 while (true) do
   begin
        cel := copy(zrodlo, licznik, Length(zrodlo)-1);

        inc(licznik, 1);

        sleep(czestotliwosc);
   end;
end;

Problem polega na tym, że gdy w wątku chcę ją wykorzystać (gdy się do niej odnoszę), to nie działa:

procedure TPrzewijanieLinijki.Execute;
begin

   myRS.PrzewijajLinieTXT(MainForm.Edit2.Text, MainForm.Edit3.Text, 100);

end;

Edit2 i Edit3 to pola do testowania procedury. W Edit2 jest tekst, Edit3 jest pusty. myRS to zmienna odnosząca się do klasy znajdującej się w moim module.
Powyższa instrukcja nie działa (tekst się nie przesuwa), jednak gdy treść tej procedury przekopiuję z mojego modułu i wkleję do metody Execute, wszystko działa. Dlaczego tak się dzieje? Jak to zmienić?

Pozdrawiam!

0

Po pierwsze to coś nie może działać w wątku czy bez niego.
Po drugie niepoprawnie używasz funkcji copy.
Po trzecie nie rozumiesz zasady przekazywania parametrów.
Po czwarte nie możesz bezkarnie z wątku zmieniać "wygląd" elementów, wszystko co tego dotyczy musi być w ramach głównego wątku, np przez synchronize.

0

Dlaczego tak się dzieje

Bo cholera nie czytasz tutoriali do końca. Ile będziesz pytać o podstawy wątków? Idź, poćwicz i wróć jak ogarniesz cały tutorial z sekcjami krytycznymi, synchronize i zastosowaniem tego.

0
_13th_Dragon napisał(a):

Po pierwsze to coś nie może działać w wątku czy bez niego.

Działa bo było testowane.

_13th_Dragon napisał(a):

Po drugie niepoprawnie używasz funkcji copy.

Używam poprawnie, bo jak już wcześniej pisałem, było to testowane.

_13th_Dragon napisał(a):

Po trzecie nie rozumiesz zasady przekazywania parametrów.

Faktycznie, trochę się pomyliłem. Teraz robię to funkcją pobierającą "źródłowy łańcuch" i zwracającą za każdym wykonaniem pętli łańcuch krótszy o literkę:

function RS.PrzewijajLinieTXT(zrodlo: String; czestotliwosc: word = 200): string;
var
  licznik: integer;
begin
licznik := 0;
 while (true) do
   begin
        result := copy(zrodlo, licznik, Length(zrodlo));

        inc(licznik, 1);
        
        sleep(czestotliwosc);
   end;
end;
_13th_Dragon napisał(a):

Po czwarte nie możesz bezkarnie z wątku zmieniać "wygląd" elementów, wszystko co tego dotyczy musi być w ramach głównego wątku, np przez synchronize.

Właśnie tu chyba tkwi problem. Przeedytowałem trochę kod tak, że funkcja operuje na zmiennych a dopiero "na miejscu" formy wykonywana jest procedura synchronize. Zeby nie było niedomówień, wklejam kody:

  1. Kod dla formy MainForm (tu gdzie chcę skorzystać z procedury modułu RS w wątku):
type TPrzewijanieLinijki = class (TThread)
    protected
      procedure Execute; override;
      procedure Przepiszmy;
end;

...

var
	Przewijanie: TPrzewijanieLinijki;
	myRS: RS;
...

procedure TprzewijanieLinijki.Przepiszmy;
begin
   MainForm.Edit3.Text := myRS.PrzewijajLinieTXT(MainForm.Edit2.Text);
end;

procedure TPrzewijanieLinijki.Execute;
begin
  Synchronize(przepiszmy);
end;

...

initialization
  Przewijanie := TPrzewijanieLinijki.Create(false);

finalization
  Przewijanie.Terminate;

end.

Ale gdy teraz uruchamiam program, jest wielka zwiecha.

3gw9t49 napisał(a):

Dlaczego tak się dzieje

Bo cholera nie czytasz tutoriali do końca. Ile będziesz pytać o podstawy wątków? Idź, poćwicz i wróć jak ogarniesz cały tutorial z sekcjami krytycznymi, synchronize i zastosowaniem tego.

Jeśli mam być szczery to już przeczytałem ze 3 tutoriale o wątkach w Delphi. A będę pytać dopóki nie zrozumiem co robię źle. Od tego jest forum, Panie Arystokrato.

0
Reiko napisał(a):
_13th_Dragon napisał(a):

Po pierwsze to coś nie może działać w wątku czy bez niego.

Działa bo było testowane.

Reiko napisał(a):
_13th_Dragon napisał(a):

Po drugie niepoprawnie używasz funkcji copy.

Używam poprawnie, bo jak już wcześniej pisałem, było to testowane.

Reiko napisał(a):
_13th_Dragon napisał(a):

Po trzecie nie rozumiesz zasady przekazywania parametrów.

Faktycznie, trochę się pomyliłem ...

No to jak było testowane czy nie? I co było testowane?
poczytaj o funkcji copy, nadal używasz niepoprawnie.

0

Nie przerywasz pętli nieskończonej - to źle bo funkcja (metoda) nie zwróci rezultatu dopóki nie dojdzie do jej końca. Nie ma co się dziwić, że program się zawiesza.

0

Jeśli mam być szczery to już przeczytałem ze 3 tutoriale o wątkach w Delphi. A będę pytać dopóki nie zrozumiem co robię źle. Od tego jest forum, Panie Arystokrato.

Czytałeś od końca do początku że nadal do ciebie nie dociera że trzeba wszystko z VCL/LCL synchronizować?
Pytać możesz, tylko że każdy prędzej czy później straci cierpliwość bo ktoś nie umie przeczytać porządnie tutoriala. Wątki to nie jest coś czego się uczysz od tak, musisz popisać kod i pomyśleć co robisz nie tak. Ale do ciebie to nie dotrze, idź pytaj na forum zawsze gdy nie potrafisz zrozumieć że VCL/LCL trzeba syncować. I jeszcze wmawiaj innym głupoty.
Ja nie wiem jakim cudem ja się nauczyłem bez forów i z jednym tutorialem używać wątków, chyba jestem niesamowicie uzdolniony. Albo otaczają mnie osoby które nie potrafią czytać tutoriali i pomyśleć.

Nie przerywasz pętli nieskończonej

Ale przecież

Używam poprawnie, bo jak już wcześniej pisałem, było to testowane.

No skoro jest testowane to pytacz ma rację, nie ważne że ten kod nie ma prawa działać.

Ale gdy teraz uruchamiam program, jest wielka zwiecha.

Wiesz, skoro ty się bierzesz za wątki jak ty nie rozumiesz że masz pętlę nieskończoną co widać na pierwszy rzut oka, to może zacznij zadawać pytania "Dlaczego ta całkowicie poprawna pętla nieskończona zawiesza program bez wątków?". Tobie nie jest potrzebny kurs wątków, tobie potrzebny jest kurs podstaw.

1 użytkowników online, w tym zalogowanych: 0, gości: 1