Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2013, 13:57   #1
Bax77
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию Проблема с потоками

Вообще в программе присутствует многопоточность,она посылает запрос серверу получает ответ,анализирует итд.Вот в чем проблема,потоки завершаются но не все аккаунты проверяются,всегда в конце остается 30-50 непроверенных,вот код:
Код:
procedure Grab.Execute;
var
CP,i:Integer;
HTTP: THTTPSend;
Log:TstringList;
B: TBytes;
astr,s: String;
begin
html1:=TStringList.Create;
while Work do
begin
CS2.Enter;
sleep(175);
inc(Q);
if Q<Proxy.Count then CP:=Q else Q:=0;
if Accs.Count=0 then  work:=false
else
begin
s:=Accs.Strings[0];
Accs.Delete(0);
end;
CS2.Leave;
if Work then
begin
Rez:=0;
if Pos(':',s)<>0 then
STR:= Copy(s,1,Pos(':',s)-1)
else
str:=s;
PASS:= Copy(s,Pos(':',s)+1,Length(s));
HTTP:=THTTPSend.create;
HTTP.Timeout:=15000;
if Proxy.Text<>'' then
begin
HTTP.ProxyHost:=Copy(Proxy.Strings[CP],1,Pos(':',Proxy.Strings[CP])-1);
HTTP.ProxyPort:=Copy(Proxy.Strings[CP],Pos(':',Proxy.Strings[CP])+1,Length(Proxy.Strings[CP]));
end;
try
if HTTP.HTTPMethod('GET','...') then
begin
html1.Clear;
Http.Document.Position:=0;
SetLength(B,Http.Document.Size);
for i := 0 to Http.Document.Size - 1 do
Http.Document.Read(B[i],1);
B:=TEncoding.Convert(TEncoding.UTF8,TEncoding.GetEncoding(1251),B);
astr:=StringOf(B);
html1.Add(astr);
html:=html1.Text;
end;
sleep(timeout);
except
Accs.Add(s);
Dec(n);
inc(er);
Form1.Label10.Caption:=inttostr(er);
end;
Synchronize(procedure
begin
if pos('...',html)=0 then
html:='';
if (HTTP.ResultCode<>200) or (pos('\\\',HTTP.Cookies.Text)=0) or (Pos('///', Html)<>0) or (length(html)<30) then
Begin
Accs.Add(s);
Dec(n);
inc(er);
Form1.Label10.Caption:=inttostr(er)
end;
end);
Synchronize(grabprof);
html:='';
html1.Clear;
HTTP.Free;
end;
end;
Html1.Free;
dec(Thread1);
if Thread1=0 then
Synchronize(Finish);
end;
Причем заметил чем больше задержка в крит секции тем меньше акков в конце остается.
Вот собственно и вопрос,как избежать задержки в секции(Так как это замедляет работу программы),но при этом сделать так,чтобы все аккаунты проверялись
Bax77 вне форума Ответить с цитированием
Старый 29.01.2013, 14:38   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

procedure Grab.Execute;
var
CP,i:Integer;
HTTP: THTTPSend;
Log:TstringList;
B: TBytes;
astr,s: String;
begin
html1:=TStringList.Create;
использование глобального объекта => неверные данные
уничтожение глобального объекта => крах всех незавершенных потоков.

Цитата:
Причем заметил чем больше задержка в крит секции тем меньше акков в конце остается.
И при чем здесь критическая секция? А вот причем
пока один из потоков сидит в кр. секции а все остальные (кроме одного который будет работать с "глобальными данными") ждут ее

чем дольше сидит, тем больше будут ждать ее тем больше шансов что один успеет проверить (не заходя в кр.секцию). А вот как только выйдет ...то все пойдет наперекосяк.
Но все это только следствие глобальности, но никак не причина.

Код:
while Work do
еще один "глобальный" глюк. (влияние других "независимых" потоков на работу данного)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.01.2013 в 14:41.
evg_m вне форума Ответить с цитированием
Старый 29.01.2013, 14:58   #3
Bax77
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию

html1:=TStringList.Create;
Стоит в разделе Private,юнита потока
А насчет while Work do,а как я тогда остановлю потоки внешне?Если не использовать глобально переменную
Bax77 вне форума Ответить с цитированием
Старый 29.01.2013, 16:11   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Сообщение от Bax77 Посмотреть сообщение
html1:=TStringList.Create;
Стоит в разделе Private,юнита потока
А насчет while Work do,а как я тогда остановлю потоки внешне?Если не использовать глобально переменную
штатными средствами TThread
Код:
 th.Terminate // извне с указанием какой именно поток надо остановить
Цитата:
Terminate sets the thread’s Terminated property to true, signaling that the thread should be terminated as soon as possible.

For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's true.
Код:
while not terminated do //внутри потока
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.01.2013 в 16:14.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с потоками vlad.md Мультимедиа в Delphi 0 07.03.2012 22:55
Проблема с потоками xStill Работа с сетью в Delphi 0 19.03.2010 10:17
Есть проблема с потоками DeeNamid Общие вопросы Delphi 2 01.11.2008 14:05
Проблема с потоками DeeNamid Общие вопросы Delphi 2 04.08.2008 17:36
Проблема с потоками vitalik007 Общие вопросы Delphi 1 11.03.2008 22:35