Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.051 c
7-1080642803
mmn
2004-03-30 14:33
2004.05.16
Как прочиать построчно журнальный файл Win2k, WinXP?


1-1083055701
DiEgo
2004-04-27 12:48
2004.05.16
Как сделать ToolBar


1-1083562733
jr_Alexandr
2004-05-03 09:38
2004.05.16
Изменение свойств компонента в режиме run-time


3-1082192120
diwin
2004-04-17 12:55
2004.05.16
запрос в Query Analyzer с выборкой из разных серверов


3-1082348585
Layner
2004-04-19 08:23
2004.05.16
Вставка записи в табл. на одном MS SQL сервере должно зеркально





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский