Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];
ВнизКак грамотно организовать много потоков Найти похожие ветки
← →
DolginD (2003-10-21 16:09) [0]У меня такая проблема. Я делаю приложение, в процессе оно лолжно создавать много одиннаковых потоков, каждый из которых будет считывать что-то из файла и проверят. Сам поток я описал, и приложение готово, но не подскажите как сделать так, чтоб моё приложение создавало много потоков(100-150). Какиеми функциями пользоваться? будублагодарен за любую информацию.
← →
Skier (2003-10-21 16:10) [1]класс TThread ?
← →
DolginD (2003-10-21 16:18) [2]ДА. Я его уже описал, но мне нужно запустить таких сразу штук 100.
← →
Reindeer Moss Eater (2003-10-21 16:21) [3]Цикл for
← →
Digitman (2003-10-21 16:26) [4]
> Я его уже описал, но мне нужно запустить таких сразу штук
> 100.
и в чем проблема ?
← →
DolginD (2003-10-21 17:42) [5]Я понимаю, что цикл for. проблема в том что я не знаю как создать потоки, под скажите футкцию
← →
y-soft (2003-10-21 17:47) [6]В цикле
TMyThread.Resume или сразу создавать запущенными
но мне нужно запустить таких сразу штук 100.
Если неоптимально написано, то будет жутко тормозить
← →
DolginD (2003-10-21 17:56) [7]На торможение сис-мы мне забить. главное что б работоспособность была. с сожданием по подробнее, и так понял :
For i:=1 to N do
Tmythread.create(true);
Я правильно понял?
← →
Семен Сорокин (2003-10-21 17:59) [8]Delphi6\Demos\Threads
← →
_Narayan_ (2003-10-21 20:54) [9]
function mStartThread(P: Pointer): THandle;
var NewThread: TThread1;
begin
NewThread:=TThread1.Create(True);
Result:=NewThread.Handle;
NewThread.Data:=P;
NewThread.Priority := tpLower;
NewThread.Resume;
end;
Функция создаёт новый поток типа TThread1 и фозврашяет его дескриптор.
В TThread1 описана публичная перемнная Data: Pointer;
(указатель на какие-нибудь данные, вашу структуру например, может быть имя файла и др.)
(можно впринципе любого типа отисать)
Приоритет устанавливаем чуть ниже среднего
(возможные значения tpIdle,tpLowest,tpLower,tpNormal,tpHigher,tpHighest,tpTimeCritical)
Нуивот. Вызываем эту функцию для каждого файла, который хотим обработать. Полученые дескрипторы можно в массиве хранить.
← →
DolginD (2003-10-21 22:30) [10]про приоритет и знаю. но мне надо создать несколько одинаковых потоков, работающих с одним файлом. ПОтоки, самодостаточны и в дальнеййшем управлении не нуждаются. А Можно эту же функцию вызывать в цикле, забивая на результат(ну или проверяя не нулевй ли он)?
← →
DolginD (2003-10-21 22:52) [11]
for i:=1 to seTHRC.Value do
begin
NewCheck:=Tcheck.Create(true);
NewCheck.Priority:=tpLower;
NewCheck.NMPOP31.UserID:=edUser.Text;
NewCheck.NMPOP31.Host:=edServ.Text;
NewCheck.NMPOP31.TimeOut:=seTimeOut.Value;
assignFile(NewCheck.F,edPath.Filename);
reset(NewCheck.F);
NewCheck.Resume;
end;
вот так я зделал и когда присваиваю имя хоста он мне выкидывает ошипку "Acces violation at adress ... " Что я не так здалал?
← →
_Narayan_ (2003-10-21 23:02) [12]Я так понимаю, что раз нужно несколько одинаковых потоков для работы с одним и тем же файлом, то разное в них что-то другое (какие-то свои параметры о которых мы не знаем). Для этого введена перемнная Data.
Про приоритет - так это для удобства, выбирай сам, что нужно.
Вызывать эту функцию в цикле просто необходимо, иначе как создать 100-150 заявленных потоков.
Результат - если вообще не интересует (дескриптор), то можно функцию превратить в процедуру. Например так.
procedure mStartThread(P: Pointer);
var NewThread: TThread1;
begin
NewThread:=TThread1.Create(True);
NewThread.Data:=P;
NewThread.Priority := tpLower;
NewThread.Resume;
end;
← →
DolginD (2003-10-21 23:10) [13]Спасибо, а про ошибку не знаешь?
Потоки Одинаковые - все они посылают запрос серверу, а из файла берут новые пароли.
← →
_Narayan_ (2003-10-21 23:13) [14]По приведённому фрагменту трудно что-либо сказать.
Для начала что есть edServ и какой тип имеет NMPOP31.Host ?
← →
DolginD (2003-10-22 12:58) [15]Всем спасибо, 2 _Narayan_ в особоенности! Я Идиот, у меня всё было правильно, только сам NMPOP3 я не создал, т.е. присваивал значения сво-вам не существующего обЪекта.
← →
DolginD (2003-10-22 13:17) [16]С ошибкой я разобрался, но у меня вот такой вопрос: Каждый поток открывает себе этот файл и читает, А хотелось бы чтоб он читал не подряд, а только то что не прочитали остальные потоки.
← →
_Narayan_ (2003-10-22 14:44) [17]Тут нужно подойти с другой стороны - выдавать каждому потоку кусочек файла для обработки.
Для этих целей опишем в потоке публичную переменную :
(примем что в файле: один пароль - одна строчка);
PasList: TStringList;
Соответственно в теле потока изменим код так чтобы строчки читались не из файла, а из этой переменной.
Не забудем создать (PasList:=TStringList.Create
) нашу переменную в начале и освободить (PasList.Free
) в конце.
Далее в том месте программы где создаются потоки делаем вот что:
Опишем временную переменную
Tmp: TStringList;
Создадим её, и воспользовавшись методом
Tmp.LoadFromFile()
загрузим в неё строки из файла с паролями.
Для собственного же удобства, всё таки введём процедуру создания потока. Вот она.
procedure mStartThread(P: String);
var NewCheck: Tcheck;
begin
NewCheck:=Tcheck.Create(true);
NewCheck.Priority:=tpLower;
NewCheck.PasList.Text:=P;
NewCheck.Resume;
end;
Теперь объявим две переменные, нужные нам для организации циклов и ещё одну служебную.
i,j : Integer;
S: String;
Пусть мы хотим чтобы каждый поток обрабатывал по 10 паролей.
For i:=0 To ( (Tmp.Count div 10) + 1 ) Do
Begin
S:="";
For j:=0 To 9 Do
If ( (i*10+j+1) = Tmp.Count ) Then Break
Else S:=S+Tmp.Strings[i*10+j];
mStartThread(S);
end;
Не забудем забыть переменную Tmp.
← →
han_malign (2003-10-22 14:49) [18]> чтоб он читал не подряд, а только то что не прочитали остальные потоки
- вот тут то и возникает подозрение в необоснованности необходимости более одного потока, для обращения к одному файлу и к одному серверу. Тем более если учитывать, что обращение к серверу и так асинхронное...
Чем, спрашивается, не устраивает ручное разделение времени, в детерминированном цикле, с детерминированным порядком чтения из файла, в одном потоке???
Опять таки, 100-150 потоков будут тормозить не столько систему, сколько друг-друга и, соотвественно, все приложение(вместо нескольких тактов, на инкремент и обработку условия(проверка состояния подпоследовательности потока) - фиг знает сколько на переключение контекстов)...
← →
_Narayan_ (2003-10-22 14:51) [19]Скорее всего я что-то напутал с ограничениями цикла и в условии,
но проверять некогда. Там максимум пара неточностей. Разберёшься.
← →
DolginD (2003-10-22 18:17) [20]Спасибо. Но вто ещё вопрос. : Если у маеня файл метров в 50, Не слишком-ли большим будет String List? Но я идею я понял.
> han_malign ©
А разве не получится быстрее, если к серверу будут обращаться несколко потоков сразу? например если time Out большой, то в цикле ожидание будет слишком долгим,а если Маленький, то есть возможность того, что поток просто не успеет связаться с сервером. По этому я решил сделать несколько потоков, но с большим(для надёжности) тайм аутом
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c