![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |