![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте! Образовался такой вопрос: Как взять данные из memo, которые ещё не были взяты потоком. Наверное непонятно.
У меня есть Memo, в котором хранятся данные. Как загрузить в поток строку, которую ещё не взял один из потоков. Я понимаю, что сдесь нужна критическая секция, но как использовать её в связке с memo не пойму. В memo есть такие строки: чавыа ывфыв укцук выаывп Нужно что бы каждый поток взял по одной строке, а не все потоке одну строку. Последний раз редактировалось babay89, 30.08.2013 в 14:47. |
#2
|
||||
|
||||
![]() как вариант:
Код:
interface uses SyncObjs, ... implementation var CriticalSection: TCriticalSection; function GetMemo: String; begin CriticalSection.Enter; if Form1.Memo1.Lines.Count>0 then begin Result:=Form1.Memo1.Lines[0]; Form1.Memo1.Lines.Delete(0); end else Result:=''; CriticalSection.Leave; end; ... initialization CriticalSection:=TCriticalSection.Create; finalization CriticalSection.Free; из потоков вызывай GetMemo. если удалять нельзя, то завести текущий номер строки и в блоке Enter-Leave возвращать строку по номеру и делать номеру инкремент. Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 30.08.2013 в 15:27. |
#3
|
||||
|
||||
![]() Немного добавлю в код:
Код:
interface uses SyncObjs, ... implementation var CriticalSection: TCriticalSection; function GetMemo: String; begin CriticalSection.Enter; try //<------------------------------------------------ if Form1.Memo1.Lines.Count>0 then begin Result:=Form1.Memo1.Lines[0]; Form1.Memo1.Lines.Delete(0); end else Result:=''; finally CriticalSection.Leave; end; end; ... initialization CriticalSection:=TCriticalSection.Create; finalization CriticalSection.Free; Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
|||
|
|||
![]() Цитата:
Хоть и первая функция подходит, но она удаляет ровно столько строк, сколько потоков, а нужно что бы удалялось, пока в мемо не будет строк. Последний раз редактировалось babay89, 01.09.2013 в 16:14. |
#5
|
||||
|
||||
![]() ну так если создать столько потоков сколько строк в Мемо, то все будет хорошо.
Пишу программы за еду. __________________ |
#6
|
|||
|
|||
![]() Цитата:
Да 3-4 тысячи потоков не есть гуд. Последний раз редактировалось babay89, 01.09.2013 в 17:07. |
#7
|
||||
|
||||
![]() ну тогда цикл создания потоков от 0 до кол-ва строк в Мемо - 1, с ограничением количества потоков семафором. либо цикл с удалением строк из Мемо пока не кончатся. вариантов много...
Пишу программы за еду. __________________ |
#8
|
|||
|
|||
![]() Цитата:
|
#9
|
||||
|
||||
![]() Код:
while Memo1.Lines.Count>0 do with TThread.Create... Пишу программы за еду. __________________ |
#10
|
|||
|
|||
![]() Цитата:
|
#11
|
||||
|
||||
![]() ну так см. 2-ое сообщение.
Пишу программы за еду. __________________ |
#12
|
|||
|
|||
![]() Цитата:
|
#13
|
||||
|
||||
![]() там вообще нет потоков
![]() 1. переписать функцию как: Код:
function GetMemo(var S: String): Boolean; 2. поток проверяет результат функции и если вернет false прекращается Пишу программы за еду. __________________ |
#14
|
|||
|
|||
![]() Цитата:
Ну тебе же выше написали как. Делаешь метод, который возвращает очередную строку из Memo или пустую строку, если строки кончились. Внутри метода надо работать через CriticalSection. Каждый поток для получения данных "дергает" этот метод, если вернулась пустая строка, то завершается (ну или ждет пока не появяться новые данные). Сам метод, в зависимотсти от того, что нужно делать, либо удаляев взятые строки, либо просто запоминает последнюю взятую. Вот _пример_ второго варианта: Код:
type TMyForm = class(TForm) Memo1 : TMemo; ... private FLastProcessedLine : Integer; // поставить в -1 в конструкторе или в OnCreate public function GetNextLine : String; end; var csGetNewLine : TCriticalSection; ... function TMyForm.GetNextLine : String; begin csGetNewLine.Enter Try If Memo1.Lines.Count-1 > FLastProcessedLine Then Begin Inc(FLastProcessedLine); Result := Memo1.Lines[FLastProcessedLine]; End Else Result := ''; Finally csGetNewLine.Leave; End; end; ... initialization csGetNewLine := TCriticalSection.Create; finalization csGetNewLine.Free; end. Как-то так. |
#15
|
|||
|
|||
![]() Все равно получается ровно столько строк, сколько потоков. Я не знаю что делать уже...
Вот исходный код. Может быть я что-то не правильно делаю... http://rghost.ru/48526833 Последний раз редактировалось babay89, 02.09.2013 в 12:31. |