Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2010, 18:24   #1
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию Потоки (Delphi)

Здравствуйте господа программисты!
С потоками раньше никогда не работал, поэтому имею слабое представление о путях их реализации. Надеюсь вы мне поможете разобраться в вопросах: Так ли это делается? Нет ли ничего лишнего? Или лучше как-то по другому делать? Есть ли от этого толк (т.к. улучшений в быстродействии вроде бы не заметил)?

В главной программе идет цикл добавления и редактирования записей в БД + в каждом созданном потоке идет добавление и редактирование записей в той же самой БД (это TClienDataSet):

Это основная форма:
Код:
TStructThread = record
    nd: Variant;
    iz: Variant;
    sn: Variant;
    Thread: TMyThread; // это поток 
  end;
TForm1 = class(TForm)
...
  public
    { Public declarations }
    MasThreads: array of TStructThread; // массив моих потоков
end;
Каждый раз когда идет добавление новой записи в главной форме
Код:
DM.Data.AppendRecord(...);
сразу следующим оператором я создаю новый поток:
Код:
SetLength(MasThreads, Length(MasThreads) + 1);
//передаю данные по котрым поток будет искать данные из других таблиц
MasThreads[High(MasThreads)].nd := данные1;
MasThreads[High(MasThreads)].iz := данные2;
MasThreads[High(MasThreads)].sn := данные3;
MasThreads[High(MasThreads)].Thread := TMyThread.Create(False);
MasThreads[High(MasThreads)].Thread.Resume;
MasThreads[High(MasThreads)].Thread.Priority := tpNormal;
внутри каждого потока получаю данные из структуры (данные1, данные2...)
и запускаю "AddNew" - процедура включающая сложный цикл добавлений и редактирований записей в том же клиенте, куда пишет основная программа
Код:
procedure TMyThread.Execute;
begin
  FreeOnTerminate := True;
  nd := Form1.MasThreads[High(Form1.MasThreads)].nd; //данные1
  iz := Form1.MasThreads[High(Form1.MasThreads)].iz;   //данные2
  sn := Form1.MasThreads[High(Form1.MasThreads)].sn;  //данные3
  Synchronize(AddNew);
end;
Теперь собственно вопросы:
- Основная процедура, которая создает массив потоков, она продолжает свои итерации или ждет пока поток завершит работу (т.е. процедура будет ждать пока созданнй поток уничтожится или продолжит генерацию новых потоков)?
- если основная процедура всетаки продолжает работу, при условии, что созданны потоки, которые еще не завершили работу (их может быть несколько), возможна ли такая ситуация, что создался поток -> этот новый поток в своей процедуре Execute берет данные с последнего элемента массива
Код:
 nd := Form1.MasThreads[High(Form1.MasThreads)].nd;
(т.к. предпологается, что последний элемент массива соответствует последнему созданному потоку) -> а тут вдруг главная процедура создает новый поток, увеличивая размер массива и этот поток (который уже не последний, а предпоследний) в результате возьмет данные из последней ячеки массива, предназначенного для последнего созданного.

Если дело обстоит так, то как тогда передавать данные потоку без путанницы?
VadEr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi потоки и графические линии world12_tk Помощь студентам 0 13.03.2010 16:03
Передача имени объекта в процедуру (Потоки) Delphi edmynt Помощь студентам 3 03.02.2010 20:58
Проблема в Delphi. Возможно, на потоки. Jean-Esther Помощь студентам 2 21.02.2009 22:32
Потоки в Delphi frai Общие вопросы Delphi 4 13.01.2008 03:39