Текущий архив: 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.47 MB
Время: 0.038 c