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