Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.03;
Скачать: CL | DM;

Вниз

Как грамотно организовать много потоков   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
1-8351
Master
2003-10-23 01:16
2003.11.03
Помогите стиль bsnone как ее можна перетакивать???????


1-8413
NewD
2003-10-22 14:00
2003.11.03
Как сделать Hint для отдельного элемента дерева.


14-8654
Gorlum
2003-10-14 11:30
2003.11.03
Про создание карт


3-8298
pashtet
2003-10-13 15:51
2003.11.03
Как правильно отключить триггер из delphi?


1-8510
MaG
2003-10-23 19:29
2003.11.03
Резка Формы