Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Многопоточность


Автор: ppc 30.9.2007, 14:07
Здравствуйте.

Столкнулся я недавно с тем, что нужно писать многопоточною программу. Почитал про класс TThread, создал несколько потоков паралельно, попробовал простые примеры для ознакомления, но проблема в том, что я не знаю как создавать потоки динамически. Объясню. Я хочу, чтоб в программе находу можно было указывать количество потоков, вот это проблема.
Каждый поток выполняет одну и туже процедуру.
procedure TMyThread1.DoWork;
 begin
myprocedure;
end;
Расскажите, пожалуйста, как создавать потоки динамически?

Автор: Coder 30.9.2007, 15:29
Цитата

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

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

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

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

Автор: BaD_SeCt0R 30.9.2007, 18:41
Есть у меня подозрение, что эта тема не для сетей...

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

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

Sanchezzz, ни в названии, ни в самом посте ни намека об этом. Ничего связанного с сетями не вижу. А вопросы о потоках - это http://forum.vingrad.ru/forum/delphi-general.html.

Автор: Sanchezzz 30.9.2007, 21:04
Нам тогда только осталось дождаться автора вопроса и пусть судят модеры раздела чея тема какого раздела мы только участники с возможностью отвечать на вопрос. изменяюсь за smile 

Автор: BaD_SeCt0R 30.9.2007, 21:23
ppc, советую знакомство с потоками начинать с http://forum.vingrad.ru/forum/topic-60076/view-all.html.

Автор: ppc 1.10.2007, 01:00
thread_n := 10;
for i:=1 to thread_n do
CreateThread(а тут что?);

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

TMyThread1 = class(TThread)
   private
     { Private declarations }
   protected
     procedure DoWork;
     procedure Execute; override;
   end;

Автор: Coder 1.10.2007, 06:57
Код

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

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

Автор: Felan 1.10.2007, 08:00
Делаешь класс потока, какой тебе надо. Например так:
Код

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)