Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
4-8711
MAX_
2003-08-29 16:44
2003.11.03
Монитор


1-8519
Димос
2003-10-23 11:54
2003.11.03
Функции из DLL


1-8489
ananimious
2003-10-23 22:00
2003.11.03
why?


14-8663
isko
2003-10-14 08:16
2003.11.03
рядом с нами


1-8463
Ai-Shibo
2003-10-24 12:17
2003.11.03
помогите, пожалуйста





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский