Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с потоками [D7, WinXP]


ingine ©   (2005-07-28 14:11:00) 

Есть несколько потоков,обрабатывающих некую информацию, при завершении каждого из потоков должна вызываться процедура находящаяся в основном потоке программы, причем другие потоки в этот момент не должны иметь доступа к этой процедуре - как реализовать???


ingine   (2005-07-28 17:20:00) [1]

вник - все работает всем спасибо :-)


Digitman   (2005-07-28 16:47:00) [2]


> ingine   (28.07.05 16:13) [13]


в ассоциацию с регулировщиком вник ?

движение на перекрестке должен регулировать ОДИН регулировщик...

его уполномачивает не тот самый водила и не тот самый пешеход, что пересекает тот самый перекресток по своим делам в заданный момент времени, а тот кто ответственен за безопасность дорож.движения на данном перекрестке

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

теперь - ассоциации :

перекресток - ресурс (неразделяемый, т.е. позволяющий одновременно движение лишь в неких обусловленных направлениях)

регулировщик - защита ресурса

водилы/пешеходы - пользователи ресурса


Alexander Panov   (2005-07-28 16:18:00) [3]

Ну а создавать CS кто будет?
Сначала нужно выполнить инициализацию.

У меня этот пример из отдельного модуля. Там сделано так:

initialization
 InitializeCriticalSection(iniCS);
finalization
 DeleteCriticalSection(iniCS);
end.


ingine   (2005-07-28 16:13:00) [4]


> Alexander Panov ©   (28.07.05 14:24) [3]
> Неверное использоание критических секций.
> 1. Критическая секция должна быть создана заранее.
> 2. КС должна быть доступна обоим потокам.
>
> Пример:
>
> var
>  IniCS: RTL_CRITICAL_SECTION;
>
> implementation
>
> procedure EnterIniCS;
> begin
>  EnterCriticalSection(IniCS);
> end;
>
> procedure LeaveIniCS;
> begin
>  LeaveCriticalSection(IniCS);
> end;
>
> function GetParm(const aSec,aParm: String): String;
> var
>  ini: TIniFIle;
> begin
>  Result := '';
>  ini := TIniFile.Create(GetIniName);
>  try
>    EnterIniCS;
>    Result := ini.ReadString(aSec,aParm,'');
>    LeaveIniCS;
>  finally
>    ini.Free;
>  end;
> end;


при таком использование КС - вылезает access violation в ntdll.dll при enterinics;


Digitman   (2005-07-28 15:37:00) [5]


> ingine


представь себе, что на оживленной улице каждый водитель или пешеход имеет своего собственного регулировщика дорожного движения .. и ни один регулировщих о других таких же как он ничего не знает - каждый машет палкой как ему вздумается ..


Reindeer Moss Eater   (2005-07-28 14:55:00) [6]

>как добится ожидания завершения myprocedure ???

Этого не надо добиваться.
Это произойдет само по себе.


Alexander Panov   (2005-07-28 14:51:00) [7]

ingine   (28.07.05 14:46) [8]
Заранее это как??? Вне потока????


Ты можешь создать КС в потоке. Но только один(!) раз и для всех потоков для защиты участка кода. Для защиты другого участка кода ты должен использовать другую критическую секцию, но тоже одну.


Alexander Panov   (2005-07-28 14:50:00) [8]

ingine   (28.07.05 14:46) [8]
Заранее это как??? Вне потока????


Просто прими как данность, что некоторый код защищается
одной и лишь одной критической секцией.
Т.е. каждый попток, который пыьается выполнить некий код, должен войти именно в одну и ту же  для всех потоков критическую секцию.

Таким образом, это и будет ответом на вопрос из [8].


ingine   (2005-07-28 14:46:00) [9]


> Обрати внимание - 1. Критическая секция должна быть создана
> заранее.

Заранее это как??? Вне потока????


Alexander Panov   (2005-07-28 14:39:00) [10]

Обрати внимание - 1. Критическая секция должна быть создана заранее.

ОДНАкритическая секция.
В нее-то и должен каждый поток пытаться войти.


ingine   (2005-07-28 14:38:00) [11]

как добится ожидания завершения myprocedure ???


ingine   (2005-07-28 14:31:00) [12]

это всего лишь пример,
критическая секция у меня создается при обработке TMyThread.create

inherited create(true);
Section:=TCriticalSection.Create;
self.FreeOnTerminate:=true;
self.resume;

и высвобождается при TMyThread.free

Section.free;

,
а используется в TMyThread.execute

section.enter;
myprocedure(param1:string;param2:integer);
section.leave;


Reindeer Moss Eater   (2005-07-28 14:28:00) [13]

Входить в КС (единственную) надо в той общей процедуре главного потока.


Alexander Panov   (2005-07-28 14:24:00) [14]

Неверное использоание критических секций.
1. Критическая секция должна быть создана заранее.
2. КС должна быть доступна обоим потокам.

Пример:

var
 IniCS: RTL_CRITICAL_SECTION;

implementation

procedure EnterIniCS;
begin
 EnterCriticalSection(IniCS);
end;

procedure LeaveIniCS;
begin
 LeaveCriticalSection(IniCS);
end;

function GetParm(const aSec,aParm: String): String;
var
 ini: TIniFIle;
begin
 Result := '';
 ini := TIniFile.Create(GetIniName);
 try
   EnterIniCS;
   Result := ini.ReadString(aSec,aParm,'');
   LeaveIniCS;
 finally
   ini.Free;
 end;
end;


ingine   (2005-07-28 14:20:00) [15]


section:=TCriticalSection.create;
section.enter;
myprocedure(param1:string;param2:integer);
section.leave;
section.free;

проблема в том (я не знаю как это объяснить) что поток не ожидает завершения myprocedure, а сразу выходит из критической секции...


Reindeer Moss Eater   (2005-07-28 14:15:00) [16]

TCriticalSection
или
InitializeCriticalSection


Наверх

Титульная страница Поиск, карта сайта Написать письмо