![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вход в CriticalSection [D7, Win95/98, WinXP]
Leaner © (2004-11-20 09:27:00)Здравствуйте !
Помогите, пожалуйста, разобраться.
Почему я попадаю в CriticalSection, не успев покинуть ее ?
var
Test_CS:RTL_CRITICAL_SECTION;
procedure TMainForm.ToolButton3Click(Sender: TObject);
begin
TryEnterCriticalSection(Test_CS);
ToolButton3Click(Sender);
RichEdit1.Lines.Add('Enter');
Application.ProcessMessages;
LeaveCriticalSection(Test_CS);
end;
initialization
InitializeCriticalSection(Test_CS);
finalization
DeleteCriticalSection(Test_CS);
end.
Verg (2004-11-20 11:56:00) [1]Критическая секция так устроена. Поток вошедиший в нее может войти в нее повторно и т.д. Но только он же. Никакой другой. Чтобы освободить секцию, поток долже выйти из нее ровно столько раз, сколько в нее входил.
Palladin (2004-11-20 09:46:00) [2]Как ты это определил? У тебя stack overflow должно выскочить... хотя в любом случае, дабы развеять твои бессмысленные сомнения, напишь в обработчике так...
If (Sender as TComponent).tag=3 then exit;
TryEnterCriticalSection(Test_CS);
(Sender as TComponent).Tag:=(Sender as TComponent).Tag+1;
Button1Click(Sender);
Memo1.Lines.Add('Enter');
LeaveCriticalSection(Test_CS);
Memo1.Lines.Add('Leave');
PS Если ты этого не видишь это еше не значит что этого не существует.