| 
| 
 | Вопрос # 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
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |