Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.10.2012, 17:24
genna29 genna29 вне форума
Прохожий
 
Регистрация: 10.10.2012
Сообщения: 1
Репутация: 10
По умолчанию Вопрос про потоки

Добрый день. Не работал раньше с потоками, столкнулся с следующей задачей. Имеется stringlist,
в нем некоторое количество например ссылок. для каждой ссылки создаю поток(MyTh1), скачиваю в нем
информацию, разбитую на блоки. Каждый блок нужно обработать в потоках(MyTh2), количество которых
ограниченно threadscount. вопрос в том, как передать данные для обработки в виде массива из TMyRecord1 в поток MyTh2,
если он локален в первом потоке...
Заранее спасибо за советы.

Код:
TMyRecord1=record
var1:string;
var2:integer;
end;

TMyRecord2=record
var1:string;
var2:integer;
end;



TMyTh1=class(TTHread)
..
TMyTh2=class(TThread)
private 
	arraylength:word;
..
var
	result:array of TMyRecord2;
	current1,current2:Word;
procedure start;
var 
	target:Tstringlist;
	MyThs1=array of TMyTh1;
begin
	current1:=0;
	for i:=0 to Target.count -1 do
	begin
		SetLength(MyThs1,i+1);
		MyThs1[i]:=Myths1.Create(false);
	end;	
end;

procedure MyTh1.Execute;
var
	cs:tcriticalsection;
	targetline:string;
	target2:array of TMyRecord1;
	myths2:array of Myth2;
begin
	cs:=tcriticalsection.create;
	cs.enter;
		targetline:=Target[i];
		inc(i);
	cs.leave;
	cs.free;
	while process(targetline) do
	begin
		l:=length(target2);
		setlength(target2,l+1);
		target2.var1:=...
		target2.var2:=...
	end;
	setlength(myth2,threadscount);	
	for i=0 to threadscount - 1 do
	begin
		myths2[i]:=Tmyth2.create(true);
		myths2[i].arraylength:=length(target2);	
	end;		
end;
Procedure MyTh2.execute;
var
	cs:tcriticalsection;
begin
	cs:=tcriticalsection.create;
	while i<arraylength do
	begin
		cs.enter;
		inc(i);
		cs.leave;
		//здесь надо обработать массив target2 
		//и записать результаты в массив result,
		//общий для всех потоков...
	end;
	cs.free;
end;
Ответить с цитированием
  #2  
Старый 10.10.2012, 18:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от genna29
вопрос в том, как передать данные для обработки в виде массива из TMyRecord1 в поток MyTh2,
если он локален в первом потоке...
Локальные данные тут не подойдут. Нужно эти локальные данные скопировать из первого потока (MyTh1) в поле второго потока (MyTh2) и с этими данными второй поток и будет работать.
Ещё первый поток может выделить память под данные, заполнить и передать ссылку на этот участок памяти второму потоку, но при этом этот первый поток должен "отказаться" от этих данных, а второй поток после обработки данных должен не забыть освободить память отведённую под них.
Цитата:
Сообщение от genna29
Код:
Procedure MyTh2.execute;
var
	cs:tcriticalsection;
begin
	cs:=tcriticalsection.create;
	while i<arraylength do
	begin
		cs.enter;
		inc(i);
		cs.leave;
		//здесь надо обработать массив target2 
		//и записать результаты в массив result,
		//общий для всех потоков...
	end;
	cs.free;
end;
Для записи результатов в общий массив используй синхронизацию.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:11.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025