[Delphi] Wątek i błąd w TRichEdit (Line iinsertion error)

0

Witam,
Mam taki problem. Aplikacja ma za zadanie przetworzyć wiele danych, które prezentowane są na żywo w kontrolce
TRichEdit. Jako, że procedura znacznie obciąża komputer, wykorzystuje wątek - w najprostszej możliwej postaci.
Dzięki wyklorzystaniu wątku, mogę w tym samym czasie bez problemu np. zmaksymalizować okno, kliknąć jakiś
przycisk itp...

Kod:

// Kursor kontroli zawsze u dołu
Na formie mamy tRichedit (redtd), tButton(Btn_1)

procedure TForm1.redtdChange(Sender: TObject);
begin
      redtd.Perform(EM_SCROLLCARET,0,0);
      redtd.Perform(EM_SCROLL,SB_LINEUP,0);
end;

// Procedura wątku
procedure Watek();
var
  i: integer;
begin
   for I := 0 to 1000 do
      begin
         // to jest dowolna symulacja 'robienia czegoś'...
         form1.redtd.Lines.Add(Inttostr(i) + '  some text here...');
         
      end;
end;

// tworzenie wątku
procedure TForm1.Btn_1Click(Sender: TObject);
var
  uchwyt_watku : THandle;
  id_watku : cardinal;
begin
   uchwyt_watku := CreateThread(nil,0,@Watek,nil,0,id_watku);
   SetPriorityClass(uchwyt_watku, HIGH_PRIORITY_CLASS);
   if uchwyt_watku = 0 Then
   begin
      MessageBox(Handle,PChar('There was a problem creating new thread with ID='+IntToStr(id_watku)),'Error',MB_OK+MB_ICONERROR);
   end;
end;

Problem:
Program wysypuje się z komunikatem 'Richedit line insertion error' w przypadku gdy
użytkownik w czasie działania procedury wątku (tutaj wypisywania tekstu 1000razy)
kliknie w obszar roboczy tRichEdit (lub zrobi cokolwiek z tekstem kontrolki, np. przesunie myszką
do góry).
Błąd: http://meggamusic.co.uk/shup/1264022433/error.png

O co chodzi? Czy jeśli wykonuje to w wątku nie mam dostępu do tRichEdit? Jak temu zaradzić?
Jest inny sposób na odblokowanie aplikacji niż użycie wątku? A może źle go używam? (znam tylko podstawy używania wątków, ale w tym
przypadku potrzebuję tylko go uruchomić, zrobić coś i zakończyć, żadne cuda).
Jak ktoś chce, oto przykładowy kod (może sprawdzić):
http://meggamusic.co.uk/shup/1264023190/Test.7z

Byłbym wdzięczny za wszelką pomoc.
-Pawel

0
  1. use TThread Luck
  2. S Y N C H R O N I Z A C J A ! ! !
0
Pepe napisał(a)

Czy jeśli wykonuje to w wątku nie mam dostępu do tRichEdit? Jak temu zaradzić?

Sam sobie odpowiedziałeś, VCL nie jest niestety thread safe i nie możesz bezpośrednio modyfikować kontrolek.
Trzeba to zrobić pośrednio, np. wysłać komunikat do formy z danymi do wpisania do RichEdit.

0
Misiekd napisał(a)
  1. use TThread Luck

Luck? Chodzi o Lock(), prawda?

Misiekd, emes30 dzięki.
Synchronizacja rzeczywiście rozwiązuje problem. Ale tylko tego pseudo kodu, który dla przykładu napisałem.
Problem jest nieco bardziej złożony, ponieważ w wątku tak naprawdę uruchamiam aplikację DOS, której wyjście przekierowywuję do
mojej aplikacji, właśnie do kontrolki tRichEdit... Dzięki za wskazówki.
-Pawel

0
Pepe napisał(a)
Misiekd napisał(a)
  1. use TThread Luck

Luck? Chodzi o Lock(), prawda?

MisiekD: To Ci się udało, pytający nie załapał [rotfl]

0
Młody napisał(a)

MisiekD: To Ci się udało, pytający nie załapał [rotfl]

Z czystej ciekawości zapytam, czegóż to nie załapałem?
-Pawel

0

widać, że nie jesteś fanem starwars

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