Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность, проблемы с многопоточностью 
:(
    Опции темы
ppc
Дата 30.9.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



Здравствуйте.

Столкнулся я недавно с тем, что нужно писать многопоточною программу. Почитал про класс TThread, создал несколько потоков паралельно, попробовал простые примеры для ознакомления, но проблема в том, что я не знаю как создавать потоки динамически. Объясню. Я хочу, чтоб в программе находу можно было указывать количество потоков, вот это проблема.
Каждый поток выполняет одну и туже процедуру.
procedure TMyThread1.DoWork;
 begin
myprocedure;
end;
Расскажите, пожалуйста, как создавать потоки динамически?
PM MAIL   Вверх
Coder
Дата 30.9.2007, 15:29 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Цитата

Расскажите, пожалуйста, как создавать потоки динамически?

Так ты их так уже и создаешь.

Попробуй так (создаст 10 потоков):
Код

thread_n := 10;
for i:=1 to thread_n do
CreateThread(...);

PM MAIL   Вверх
BaD_SeCt0R
Дата 30.9.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: нет
Всего: 18



Есть у меня подозрение, что эта тема не для сетей...


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Sanchezzz
  Дата 30.9.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 1
Всего: 60



BaD_SeCt0R, может и для сетей Indy ведь с ним можно работать с разными потоками защищенными и нет. Нужно каждому заглянуть в глубины инди.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
BaD_SeCt0R
Дата 30.9.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: нет
Всего: 18



Цитата(Sanchezzz @  30.9.2007,  19:31 Найти цитируемый пост)
BaD_SeCt0R, может и для сетей Indy ведь с ним можно работать с разными потоками защищенными и нет. Нужно каждому заглянуть в глубины инди. 

Sanchezzz, ни в названии, ни в самом посте ни намека об этом. Ничего связанного с сетями не вижу. А вопросы о потоках - это общие вопросы.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Sanchezzz
  Дата 30.9.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 1
Всего: 60



Нам тогда только осталось дождаться автора вопроса и пусть судят модеры раздела чея тема какого раздела мы только участники с возможностью отвечать на вопрос. изменяюсь за smile 


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
BaD_SeCt0R
Дата 30.9.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 9.10.2006
Где: Анапа

Репутация: нет
Всего: 18



ppc, советую знакомство с потоками начинать с этой статьи.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
ppc
Дата 1.10.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 5.6.2007

Репутация: нет
Всего: нет



thread_n := 10;
for i:=1 to thread_n do
CreateThread(а тут что?);

можно поподробнее, т.к. я каждый поток объявляю

TMyThread1 = class(TThread)
   private
     { Private declarations }
   protected
     procedure DoWork;
     procedure Execute; override;
   end;
PM MAIL   Вверх
Coder
Дата 1.10.2007, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Код

function ThreadProc(p : pointer) : dword;
begin
// ТВОЙ КОД
end;

thread_n := 10;
for i:=1 to thread_n do
  CreateThread(nil,0,@ThreadProc,nil,0,0);

PM MAIL   Вверх
Felan
Дата 1.10.2007, 08:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: нет
Всего: 7



Делаешь класс потока, какой тебе надо. Например так:
Код

type
  TiaSphere = class(TThread)
 protected
    fCS_AccessToProps: TCriticalSection;
    fTimeCount: Cardinal;
    fSphereEvent: TSimpleEvent;
    fRequestInterval: Cardinal;

    procedure Execute; override;
 public
    Constructor Create(CreateSuspended: Boolean); virtual;
    Destructor Destroy; override;
    procedure Start;
    procedure Stop;
end;


Реализация примерно такая:
Код

procedure TiaSphere.Execute;
begin
  SetName;

  while (not Terminated) do
  Begin
    try
      fSphereEvent.WaitFor(INFINITE);

      If Terminated then Continue;

      if (GetTickCount() - fTimeCount) > ( fRequestInterval ) then
        begin
          try
            Monitoring;
          finally
            fTimeCount := GetTickCount;
          end;
        end;

      //пауза что бы поток не кушал такты процессора слишком сильно
      Sleep(50);
    except
      on E: Exception do
        begin
          WriteToLog('Error in thread: ' + e.Message);
        end;
    end;
  end;
end;

constructor TiaSphere.Create(CreateSuspended: Boolean);
begin
  inherited;

  fRequestInterval := MSC_REQUEST_INTERVAL;

  fCS_AccessToProps := TCriticalSection.Create;

  fSphereEvent := TSimpleEvent.Create;
  fSphereEvent.ResetEvent;

  fSphereAPI := TiaSphereAPI.Create;
  fSphereAPI.Log := fLoger;

  setDebugLogging( False );
end;

destructor TiaSphere.Destroy;
begin
  Terminate;
  fSphereEvent.SetEvent;
  WaitFor;

  FreeAndNil(fSphereAPI);

  FreeAndNil(fSphereEvent);
  FreeAndNil(fCS_AccessToProps);

  inherited;
end;

procedure TiaSphere.Start;
begin
  try
    fSphereAPI.Active := True;

    fTimeCount :=  GetTickCount;

    fSphereEvent.SetEvent;

    WriteToLog('Monitoring started');

    setIsStarted( True );
  except
    on e: Exception do
      begin
        fSphereAPI.Active := false;
        WriteToLog('Error while monitoring started: ' + e.Message);
      end;
  end;
end;

procedure TiaSphere.Stop;
begin
  try
    fSphereEvent.ResetEvent;

    fSphereAPI.Active := False;

    WriteToLog('Monitoring stopped');

    setIsStarted( False );
  except
    on e: Exception do
      begin
        WriteToLog('Errro while monitoring started: ' + e.Message);
      end;
  end;
end;



Вот...
Ну и создаешь экземпляры этого класса сколько тебе надо примерно так:

Код

  fSphere := TiaSphere.Create(true);
  fSphere.Resume;


Потом, что бы запустить или остановить вызываешь методы start и stop.

Это сообщение отредактировал(а) Felan - 1.10.2007, 08:01


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.