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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2011, 17:15   #1
QuadroX
323787261
Пользователь
 
Аватар для QuadroX
 
Регистрация: 19.12.2008
Сообщений: 49
По умолчанию Работа с потоками

В универе дали задание написать программу на любом языке.

Условие:
Первый поток ищет текстовые строки в файле. Второй поток занимается подсчетом количества этих строк. Использовать события(CreateEvent).

Не могу понять логику. Как разделить поиск текстовых строк и подсчет количества на два потока?

Ведь поиск работает примерно по такой схеме:

пока не конец файла
начало
читаем строку;
если прочитанная стока содержит нужную строку
счетчик = счетчик + 1;
конец

Все в одном цикле делается. Не понимаю что от меня хотят.
ICQ: 323787261
Email: pschegolevatykh@gmail.com
QuadroX вне форума Ответить с цитированием
Старый 15.09.2011, 18:25   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

от Вас хотят видеть не только общий алгоритм (он, кстати, правильный), а ещё и конкретный код и приложение, которое работало бы. ну, что-то вроде этого:
Код:
.....
var str1:TStream;
    str2:TStringStream;
    str:string;
    a,i:Integer;
begin
   PutA:='';
   NameA:='';
   str1:=TFileStream.Create(ExtractFilePath(ParamStr(0))+
                   ExtractFileName(ParamStr(0)),fmOpenRead or fmShareDenyWrite);
   str2:=TStringStream.Create(str);
   str2.CopyFrom(str1,str1.Size);
   a:=1;
   i:=1;
   while(a=1)do
   begin
      str2.Seek(str2.Size-i,soFromBeginning);
      str:=str2.ReadString(str2.Size);//переделали данные из потока в строку
      if(str[1]=Chr(0))then a:=0;//параметр выхода из цикла
      if(str[1]<>Chr(0))then NameA:=str;
      i:=i+1;
   end;
   if(NameA<>'')then PutA:=ExtractFilePath(NameA);//из полного имени выделяем путь
   str2.Free;
   str1.Free;
......
это просто работа с потоками, а не ваша задача...но попытаться применить можно...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 15.09.2011, 18:56   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TStream тут не к месту совершенно.
тут нити нужны, то есть TThread.

первый поток использует событие для того чтобы сообщить второму что он прочитал строку.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2011, 19:38   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Ну, образно выражаясь, человек спросил: как ловить зимой рыбу? Я образно ответил, что нужна наживка. А Вы мудро образно подсказали, что сначала нужно лунку просверлить во льду...

А чем TStream тут не подойдёт? С человека в начале года требуют программу, работающую с потоками!!! Я в эти потоки въехал только спустя 3 года, как ВУЗ закончил... И никто не помогал... А так хоть какое-то начало ему дал, пусть дальше сам покопает в этом направлении...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 15.09.2011, 20:03   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что TStream не имеет отношение к многопоточности.
CreateEvent, события, по сути говоря синхронизирующий примитив.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2011, 22:16   #6
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

сначала создаются события:
Код:
Event1=CreateEvent( NULL, FALSE, TRUE, NULL);			//например, с автосбросом			
Event2=CreateEvent( NULL, FALSE, TRUE, NULL);			//например, с автосбросом
1 поток:
Код:
пока не конец файла
начало
читаем строку;
SetEvent(Event1);		//Установить событие
		WaitForSingleObject(Event2, INFINITE);	//Ожидание события
цикл
2 поток:
Код:
	while(1)
	{
		WaitForSingleObject(Event1, INFINITE);	//Ожидание события
счетчик = счетчик + 1;
SetEvent(Event2);		//Установить событие
}
грубо, но как-то так
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 15.09.2011, 23:58   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

QuadroX

пускай первый поток занимается только чтением строк из файла и складирование их в очередь, а второй поток - выгребает из очереди данные, ищет совпадение, увеличивает счётчик.
Rififi вне форума Ответить с цитированием
Старый 16.09.2011, 09:14   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

первый поток
пока не конец файла
начало
читаем строку;
если прочитанная стока содержит нужную строку
/////// счетчик = счетчик + 1;
Извещаем второй поток (посылаем событие)
повторить
изещаем о заверщениии
конец

второй поток
ждет события
при получении если событие увеличить то увеличили счетчик
если событие закончили то вывести и закончить
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.09.2011, 17:30   #9
QuadroX
323787261
Пользователь
 
Аватар для QuadroX
 
Регистрация: 19.12.2008
Сообщений: 49
По умолчанию

Спасибо за разъяснения многие моменты стали понятны. Не понятно как можно завершить поток 2? Если он работает по таком принципу:

// поток 2

Код:
while(true)
{
    WaitForSingleObject(foundEvent, INFINITE);
    matchesCount++;
    PulseEvent(countEvent);
}
Цитата:
второй поток
ждет события
при получении если событие увеличить то увеличили счетчик
если событие закончили то вывести и закончить
Он ждет только события foundEvent на увеличение счетчика. Не пойму как можно реализовать этот вариант.
ICQ: 323787261
Email: pschegolevatykh@gmail.com
QuadroX вне форума Ответить с цитированием
Старый 20.09.2011, 07:06   #10
QuadroX
323787261
Пользователь
 
Аватар для QuadroX
 
Регистрация: 19.12.2008
Сообщений: 49
По умолчанию

Поднимем тему.
ICQ: 323787261
Email: pschegolevatykh@gmail.com
QuadroX вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с потоками session Общие вопросы C/C++ 6 21.06.2010 17:13
Работа с потоками Яр|/||< (^_^) Общие вопросы Delphi 5 09.03.2010 08:23
Работа с потоками den49 Помощь студентам 0 06.10.2009 14:52
Работа с потоками Нюська Общие вопросы Delphi 3 27.05.2009 00:52
C++, работа с потоками mat90x Помощь студентам 20 15.05.2008 22:20