PDA

Просмотр полной версии : [Помогите!] Поток


maulis
05.11.2013, 20:27
if form5.ComboBox1.Text = 23123' then
begin

for i := 0 to list.Count-1 do
begin
form5.Caption:='ewrew';
s:=id[Ссылки могут видеть только зарегистрированные и активированные пользователи](list[z]);
RegExp.InputString :=s;
RegExp.Expression := '342432r":"(.*?)"';
if RegExp.Exec then
if strtoint(RegExp.Match[1]) <= strtoint(form5.edit3.text) then
begin
form5.listbox1.items.add(list[z]+' '+regexp.Match[1]);
end;
end;



Вставляю этот код в поток, а он не работает :( В чем может быть проблема?

J-Fobos
05.11.2013, 23:29
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

maulis
06.11.2013, 11:21
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Tr0y
06.11.2013, 19:02
unit MyThread;
...
var s: string;
...
procedure MyThread1.Execute;
begin
try
s:=id[Ссылки могут видеть только зарегистрированные и активированные пользователи](list[z]);
Synchronize(MySynchCaption);
if RegExp.Exec then
if strtoint(RegExp.Match[1]) <= strtoint(form5.edit3.text) then begin
Synchronize(MySynchListBox);
end;
except
ShowMessame('Error: Thread.Execute');
end;
end;

procedure MyThread1.MySynchCaption;
begin
if Length(s)>0 then begin // длина строки больше 0 ?
RegExp.InputString := s;
RegExp.Expression := '342432r":"(.*?)"';
end;
end;

procedure MyThread1.MySynchListBox;
begin
try
form5.listbox1.items.add(list[z]+' '+regexp.Match[1]);
except
ShowMessame('Error: Thread.MySynchListBox');
end;
end;
...

Отдельный поток делается для того, чтобы основной поток, отвечающий за перерисовку интерфейса в том числе, не занимать рутинными операциями, что может повлечь зависание проги во время рутины.
Тело вторичного потока реализуется в юните вторичного потока в процедуре Execute, в ней происходит рутиная работа.
Чтобы сделать изменения в интерфейсе, делают синхронизацию, реализуемую в отдельных процедурах, в нашем случае это MySynchCaption - тут обновляется значение компонента RegExp, а также процедура MySynchListBox - тут обновляется значение какого-то листбокса.

Представь, что в потоке ты что-то вычисляешь, а результаты его работы отдельными процедурами показываешь, т.е тут как бы 2 части:
1-вычисляет в памяти,
2 - выводит/обновляет значения для пользователя.

Мануал:
Организация многопоточной работы в Delphi ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Использование метода Synchronize при работе с потоками ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Также у потоков есть свои приоритеты + нюансы в свойствах жизни потока. той статьи выше тебе будет достаточно. Если что - гугл.

надеюсь, не запутал /problem