Delphi (видеоурок). Многопоточность и синхронизация
10 октября 2010
В этом видеоуроке показано, как создать многопоточное приложение и правильно синхронизировать потоки между собой.
Надеюсь видео о добавлении одного потока вы уже видели. Теперь немного о критических секциях и методе Synchronize.
спасибо за урок
я написал чекер на другом языке и хочу переписать на С
может ктото выложить исходник написаный на С ?
и хотелось бы увидеть урок по использованию прокси
в такого рода програмах это уже какбы неизбежно )
написал чекер взял за основу ваш пример
возможно ли что этот пункт невыполнится ?
Accounts.Add(FAcc+’;'+FPas);
если возможно то по какой причине и как с этим боротся
просто у меня чекер заканчивает проверку непроверив все аккаунты
постоянно несколько остаётся (каждый раз по разному)
и под конец заметно падает скорость
возможно ли что потоки подвисают ?
если да то изза чего и как с этим боротся
спс за пример и за ответ если такой будет
про логи я понимаю что это необходимо и так я и сделаю только стараюсь оттянуть этот момент (мож всётаки по логике удасца найти проблему )))
я всётаки грешу на эту строчку
Accounts.Add(FAcc+’;'+FPas);
чекер завершает работу и выводит
dec(Thread);
if Thread=0 then
MessageBox(Form1.Handle,’Проверка завершена’, ‘Сообщение’, MB_OK)
кстать меседжбокс поставил вместо шовмеседж так как с шовмеседж после выключения чекера выскакивала ошибка
так вот если чекер выводит ОК в конце знач потоков уже нет
тогда почему не все акки проверил?
думаю какраз изза Accounts.Add(FAcc+’;'+FPas);
возможно ли что пару потоков пытаются записать одновременно изза чего и не добавляется акк?
если такое возможно то может это тоже нужно добавить в критическую секцию?
если возможно и можна добавить в крит секцию то нужно создавать новую или таже CS может быть ?
извините если чего глупого наплёл, с делфи только начинаю )
Здравствуйте.Насколько я понял логику Вашей программы, то она проверяет валидность аккаунта по присутствующей куке, а как можно реализовать проверку валидности, исходя из появляющегося сообщения об ошибке, свидетельствующей о том, что мы не прошли авторизацию ?
Я представляю себе это так (укажу только участок проверки):
if Pos(‘Ошибка авторизации’, HTTP.ResponseText)0 then
Result:=1
else
Result:=0;
Поправьте, если я не прав.И насколько я понял, то в вашем кодер результат 1 означает успешную авторизацию, а 0 – ошибочную.Спасибо за Внимание.Приму любой Ваш ответ
Really interesting, thanks !
I would be interested to know how do you setup a STOP button.
Of course you’ll turn WORK to FALSE but you’ll have to wait the end of threads started…
У меня проблемка с потоками, пытался завершить потоки всеми способами которые знаю и ни один не работает корректно, постоянно вылезают ошибки (рантайм эррор бла бла)
//////////////BEGIN CREATE//////////////
var
i:integer;
begin
works:=true; //для цикла
SetLength(fakeserver,se3.Value); //кол-во потоков
maxservers:=se3.Value;
for i:=1 to maxservers do
begin
fakeserver[i]:=TFakeServer.Create(true);
fakeserver[i].udp:=tmyudpserver.Create(nil);
fakeserver[i].udp.num:=i;
fakeserver[i].FreeOnTerminate:=true;
fakeserver[i].Priority:=tpLower;
fakeserver[i].Resume;
end;
tmr1.Enabled:=true; //для показа счетчика потоков
end;
//////////////END CREATE//////////////
//////////////BEGIN TERMINATE//////////////
tmr1.Enabled:=False;
works:=False;
if maxservers0 then
begin
for i:=1 to maxservers do
begin
fakeserver[i].Terminate;
end;
end;
//////////////END TERMINATE//////////////
ну и код потока
procedure TFakeServer.execute;
begin
Inc(thrcount);
udp.OnUDPRead:=onudpread;
while works=true do
begin
end;
udp.Free;
Dec(thrcount);
end;
Пробовал уже и while not Terminated получается то же самое, как правильно убить потоки?) Заранее спс
спасибо за урок
я написал чекер на другом языке и хочу переписать на С
может ктото выложить исходник написаный на С ?
и хотелось бы увидеть урок по использованию прокси
в такого рода програмах это уже какбы неизбежно )
[Ответить]
написал чекер взял за основу ваш пример
возможно ли что этот пункт невыполнится ?
Accounts.Add(FAcc+’;'+FPas);
если возможно то по какой причине и как с этим боротся
просто у меня чекер заканчивает проверку непроверив все аккаунты
постоянно несколько остаётся (каждый раз по разному)
и под конец заметно падает скорость
возможно ли что потоки подвисают ?
если да то изза чего и как с этим боротся
спс за пример и за ответ если такой будет
[Ответить]
ошибки отлавливаю так
HTTP.Get(‘http://2ip.ru/',data);
except
on E: Exception do err:= 1;
[Ответить]
Zdez Bil Ya Reply:
октября 27, 2011 at 22:50
что такое data в вашем запросе? Запрос Get, т.е. без параметров. Что тогда такое data?
[Ответить]
страница получаемая с 2ip.ru
[Ответить]
Zdez Bil Ya Reply:
октября 27, 2011 at 23:00
Тестируйте на небольшом количестве, подробно записывая все действия в лог
[Ответить]
data:= TMemoryStream.Create;
page := TStringList.Create;
data.Position := 0;
page.LoadFromStream(data);
MessageBox(Form1.Handle,PChar(page.strings[109]),’Страница 109 с сайта 2 ип’ , MB_OK) ;
[Ответить]
ой там строка 109 )
[Ответить]
про логи я понимаю что это необходимо и так я и сделаю только стараюсь оттянуть этот момент (мож всётаки по логике удасца найти проблему )))
я всётаки грешу на эту строчку
Accounts.Add(FAcc+’;'+FPas);
чекер завершает работу и выводит
dec(Thread);
if Thread=0 then
MessageBox(Form1.Handle,’Проверка завершена’, ‘Сообщение’, MB_OK)
кстать меседжбокс поставил вместо шовмеседж так как с шовмеседж после выключения чекера выскакивала ошибка
так вот если чекер выводит ОК в конце знач потоков уже нет
тогда почему не все акки проверил?
думаю какраз изза Accounts.Add(FAcc+’;'+FPas);
возможно ли что пару потоков пытаются записать одновременно изза чего и не добавляется акк?
если такое возможно то может это тоже нужно добавить в критическую секцию?
если возможно и можна добавить в крит секцию то нужно создавать новую или таже CS может быть ?
извините если чего глупого наплёл, с делфи только начинаю )
[Ответить]
Zdez Bil Ya Reply:
октября 27, 2011 at 23:50
Быть может всё. Лог – самое лучшее решение: видно, что, где и когда проверяется и делается
[Ответить]
Здравствуйте.Насколько я понял логику Вашей программы, то она проверяет валидность аккаунта по присутствующей куке, а как можно реализовать проверку валидности, исходя из появляющегося сообщения об ошибке, свидетельствующей о том, что мы не прошли авторизацию ?
Я представляю себе это так (укажу только участок проверки):
if Pos(‘Ошибка авторизации’, HTTP.ResponseText)0 then
Result:=1
else
Result:=0;
Поправьте, если я не прав.И насколько я понял, то в вашем кодер результат 1 означает успешную авторизацию, а 0 – ошибочную.Спасибо за Внимание.Приму любой Ваш ответ
[Ответить]
Ой, я ошибся, получается, что в моем случае код будет вида:
Result:=0
else
Result:=1;
Надеюсь на Вашу помощь =)
[Ответить]
Как сделать чекер для origin по этому исходнику?
[Ответить]
Really interesting, thanks !
I would be interested to know how do you setup a STOP button.
Of course you’ll turn WORK to FALSE but you’ll have to wait the end of threads started…
Using a ThreadList or EventHandler ?
Beny
[Ответить]
А на каком delphi ты писал её ?
delphi 7 или что … ?
[Ответить]
У меня проблемка с потоками, пытался завершить потоки всеми способами которые знаю и ни один не работает корректно, постоянно вылезают ошибки (рантайм эррор бла бла)
//////////////BEGIN CREATE//////////////
var
i:integer;
begin
works:=true; //для цикла
SetLength(fakeserver,se3.Value); //кол-во потоков
maxservers:=se3.Value;
for i:=1 to maxservers do
begin
fakeserver[i]:=TFakeServer.Create(true);
fakeserver[i].udp:=tmyudpserver.Create(nil);
fakeserver[i].udp.num:=i;
fakeserver[i].FreeOnTerminate:=true;
fakeserver[i].Priority:=tpLower;
fakeserver[i].Resume;
end;
tmr1.Enabled:=true; //для показа счетчика потоков
end;
//////////////END CREATE//////////////
//////////////BEGIN TERMINATE//////////////
tmr1.Enabled:=False;
works:=False;
if maxservers0 then
begin
for i:=1 to maxservers do
begin
fakeserver[i].Terminate;
end;
end;
//////////////END TERMINATE//////////////
ну и код потока
procedure TFakeServer.execute;
begin
Inc(thrcount);
udp.OnUDPRead:=onudpread;
while works=true do
begin
end;
udp.Free;
Dec(thrcount);
end;
Пробовал уже и while not Terminated получается то же самое, как правильно убить потоки?) Заранее спс
[Ответить]