Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Потоки   Найти похожие ветки 

 
Kalmykov Sergei   (2004-03-30 13:56) [0]

Я создаю 3 потока,потом запукаю первый он обрабатывает строку, потом передаёт строку 2 потоку, полученую строку он изменяет и передаёт 3 потоку.
Получается что потоки для правильного результата должны запускаться в порядке 1-2-3 а иногда происходит 1-3-2.
Как добиться чтобы потоки выполнялись друг за другом?
Спасибо


 
BiN ©   (2004-03-30 14:17) [1]

использовать wait-функции или же критические секции


 
Алхимик ©   (2004-03-30 14:18) [2]

Не сильно понятно зачем в этой задаче потоки.


 
Digitman ©   (2004-03-30 17:10) [3]


> Я создаю 3 потока,потом запукаю первый


здесь - подробней

созданный поток УЖЕ считается "запущенным", неважно suspended он или нет ..

что в связи с этим означает "запускаю первый" ?


 
Kalmykov Sergei   (2004-03-30 17:47) [4]

создаю
T1 := TMyHread1.Create(true);
T2 := TMyHread2.Create(true);
T3 := TMyHread3.Create(true);
указываю приоритеты
T1.Priority := tpNormal;
T2.Priority := tpNormal;
T3.Priority := tpNormal;
передам в него строку
T1.Str := "string";
запускаю
T1.Resume;
происходит событие
procedure TMyHread1.Execute;
begin
... код который обробатывает строку
перед запуском второго передам в его модуль значение
что бы он обработал строку
T2.STR := T1.STR
end;
запускаю второй
T2.Resume;
тоже самое с третьем
T3.Resume;
а здесь он вызывает окно и показывает результат
procedure TMyHread3.Execute;
begin
... код который обробатывает строку
Showmessage(t3.str);
end;


 
BiN ©   (2004-03-30 17:51) [5]

ты бы хоть для приличия Synchronize использовал бы (см. Showmessage(t3.str);)


 
Slym ©   (2004-03-31 05:04) [6]

Вопервых на первый взгляд задача линейная... "зачем потоки?"
Но возможно и нелинейное происхождение задачи...

лучше всего тебе использовать синхронизированные буферы или стеки строк!
прим: FIFO буфер (переделать в LIFO дело пары секунд)

unit SafeStack;

interface
uses classes,SyncObjs;
type
TSafeStack=class
private
 FStrings:TStrings;
 CriticalSection:TCriticalSection;
 function GetCount:integer;
public
 constructor Create;
 destructor Destroy;override;
 function Pop:string;
 function Put(str:string):integer;
 procedure Clear;
 property Count:integer read GetCount;
end;

implementation

constructor TSafeStack.Create;
begin
 CriticalSection:=TCriticalSection.Create;
 FStrings:=TStringList.Create;
 TStrings:=StringsList
 FPosition:=0;
end;

destructor TSafeStack.Destroy;
begin
 FStrings.Free;
 CriticalSection.Free;
 inherited;
end;

function TSafeStack.Pop: string;
begin
 CriticalSection.Enter;
 try
   result:=FStrings[0];
   FStrings.Delete(0);
 finally
   CriticalSection.Leave;
 end;
end;

function TSafeStack.GetCount: integer;
begin
 result:=FStrings.Count;
end;

function TSafeStack.Put(str: string): integer;
begin
 CriticalSection.Enter;
 try
   result:=FStrings.Add(str);
 finally
   CriticalSection.Leave;
 end;
end;

procedure TSafeStack.Clear;
begin
 CriticalSection.Enter;
 try
   FStrings.Clear;
   FPosition:=0;
 finally
   CriticalSection.Leave;
 end;
end;

end.


 
Slym ©   (2004-03-31 05:21) [7]

TT1 = class(TThread)//тоже и T2 и T3
 private
   FBuffer:TSafeStack;
 protected
   procedure Execute; override;
 public
   constructor Create(CreateSuspended: Boolean);override;
   destructor Destroy;override;
   property Buffer:TSafeStack read FBuffer;
 end;

implementation

{ TT1}

constructor TT1.Create(CreateSuspended: Boolean);
begin
 FBuffer:=TSafeStack.Create;
 inherited;
end;

destructor TT1.Destroy;
begin
 FBuffer.Free;
 inherited;
end;

procedure TT1.Execute;
var s:string;
begin
 while not Terminated do
 begin
   if FBuffer.Count=0 then
   begin
     sleep(100);
     continue;
   end;
   try
     s:=FBuffer.Pop;
     //rabotaem
    T2.Buffer.Put(s);//Передали дальше
   except
     Terminate;
   end;
 end;
end;

end.


 
Slym ©   (2004-03-31 05:26) [8]

Чтобы постоинно не делать if buffer.count=0
можно в буфер приляпать WaitForString(TimeOut) (Дело еще пяти минут!)

типа
Event:TEvent;

на Pop:

if count>0 then
result:=...
else
if WaitForSingleEvent(Event)=...;
result:=...

на Put Event сигралиЩЪ



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
1-1083487487
mr.Delphin
2004-05-02 12:44
2004.05.16
Диалог


3-1082600463
Марат
2004-04-22 06:21
2004.05.16
Запрос


7-1080806222
snake1977
2004-04-01 11:57
2004.05.16
Список установленных шрифтов


7-1081073322
NV-VETAL
2004-04-04 14:08
2004.05.16
DCOM. Как зарегистрировать клиента с помощью реестра?


14-1083134355
Тимохов
2004-04-28 10:39
2004.05.16
TThread.WaitFor