Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 151

Раздел: Delphi » Прочее
/ вопрос открыт /

привет всем.
У меня возникла проблема. Мне нужно распараллелить программу, использующую для своего решения генетический алгоритм. Так вот. На С я это сделать могу легко, там есть библиотека MPI, но так как проект написан на Delphi необходимо на них и релизовывать распараллеливание. Прочитала много информации по потокам, но че-то при реализации выпадают ошибки.

Попробую объяснить...
В процедуре должен создаваться массив потоков, количество задается пользователями, в цикле они должны запускаться и работать параллельно, далее по достижению результатов должны их передавать в массив. Этот массив обрабатывается и переходит н аследующую итерацию, где опять запускаются потоки, вычесляются результаты и т.д.

begin
SetLength(thread, parProc);
for ThreadCount := 0 to parProc - 1 do
begin
//создаем параллельные потоки и запускаем их позднее
Thread[ThreadCount]:= ThreadGeneAlg.Create(true);
Thread[ThreadCount].processNumber:= threadCount;
Thread[ThreadCount].FreeOnTerminate:=true;
end;

for i := 0 to колисество_итераций -1 do
[B] begin[/B]
//запускаем параллельные процессы
for ThreadCount := 0 to parProc - 1 do
Thread[ThreadCount].Resume;

я так понимаю, что здесь нужно вставить функцию ожидания завершения всех потоков, иначе главный процесс пойдет работать далее

но как я понимаю, эта функция будет ожидать поочередное завершение потоков?...

for j := 0 to parproc - 1 do
thread[j].WaitFor;

... //далее должны потоки обмениваться результатами и цикл переходит на следующую итерацию
[B]end;[/B]

//очищаем массив потоков
for threadCount := 0 to parProc - 1 do
thread[ThreadCount].Free;
// и выходим из процедуры
end;

Но у меня большие подозрения на то, что я неправильно этими потоками пользуюсь. Вот, к примеру, если бы поток был запускался единожды и после его выполнения ничего не выполняла процедура, ошибки не возникало. А у меня процедура Execute выполняется, а при выходе вылетает ошибка "Thread Error: Неверный дескриптор (6)". Если не ставить процедуру WaitFor, то главный поток пойдет далее и вылетит куча ошибок.
В общем, помогите мне разобраться с этими потоками, пожалуйста:(.[B][/B]..

Приложение:
  1.  


Лена:) Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Лена:) (статус: Посетитель)
Вопрос отправлен: 3 декабря 2008, 15:03
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Nasgool

Здравствуйте, Лена:)!
Попробуйте создать такой класс:
type
TTreadList = class(TComponent)
private
Tread: TThread;//сдесь указать на шаблон необходимого потока
List: Tlist;
public
Count: Integer;
function Add: Integer;
procedure Resume(Index: Integer);
procedure Suspend(Index: Integer);
procedure Terminate(Index: Integer);
constructor Create; override;
destructor Destroy; override;
end;

В принципе смысл понятен - доплнительные вопросы в форум :)

Ответ отправил: Nasgool (статус: 2-ой класс)
Время отправки: 6 декабря 2008, 06:09


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 3 декабря 2008, 16:11; участников в обсуждении: 2.
Amidamaru

Amidamaru (статус: 4-ый класс), 3 декабря 2008, 16:06 [#1]:

Хотелось бы немного более полный код.
Например ThreadGeneAlg это переменная или класс?
как объявлена переменная thread?
и по моему личному мнению лучше использовать TList для хранения списка потоков.
Если ты знаешь как использовать семафоры, то можешь через них контролировать сколько потоков запущено. В Delphi почти все API функции такиеже как и в си.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Вадим К

Вадим К (статус: Академик), 3 декабря 2008, 16:11 [#2]:

если выставленно FreeOnTerminate:=true;, то вызывать деструктор не надо. Он будет автоматом вызван.
При своем завершении поток может вызывать пользовательскую процедуру. В ней можно подсчитывать, сколько потоков завершено и в случае, если все отработали - делать новую иттерацию. И не надо ждать с помощью WainFor
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.02 сек.