|
Вопрос # 2 151/ вопрос открыт / |
|
привет всем.
У меня возникла проблема. Мне нужно распараллелить программу, использующую для своего решения генетический алгоритм. Так вот. На С я это сделать могу легко, там есть библиотека 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]..
 |
Вопрос задала: Лена:) (статус: Посетитель)
Вопрос отправлен: 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 (статус: 4-ый класс), 3 декабря 2008, 16:06 [#1]:
Хотелось бы немного более полный код.
Например ThreadGeneAlg это переменная или класс?
как объявлена переменная thread?
и по моему личному мнению лучше использовать TList для хранения списка потоков.
Если ты знаешь как использовать семафоры, то можешь через них контролировать сколько потоков запущено. В Delphi почти все API функции такиеже как и в си.
|
|
Вадим К (статус: Академик), 3 декабря 2008, 16:11 [#2]:
если выставленно FreeOnTerminate:=true;, то вызывать деструктор не надо. Он будет автоматом вызван.
При своем завершении поток может вызывать пользовательскую процедуру. В ней можно подсчитывать, сколько потоков завершено и в случае, если все отработали - делать новую иттерацию. И не надо ждать с помощью WainFor
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|