|
Тема |
Малко помощ? |
|
Автор |
ИвKo (особняк) |
|
Публикувано | 17.10.09 11:45 |
|
|
Малко ми е трудно да обесня какво точно правя и какво точно не се получава, но ще се опитам.
Имам процедура която в един вътрешен за нея цикъл създава N на брой TThread-а - да кажем някъде към 5000 като се изчаква ако активните, създадени, TThread-ове са повече от 8 (вътрешно ограничение). Нещо от типа на:
var
FInThreads:Boolean; // Глобална променлива
FAskStop:Boolean; // Глобална променлива
FStartEnum:Boolean; // Глобална променлива
FRunningThreads:Integer = 0; // Глобална променлива
procedure StartThreads;
var
iCount:integer;
begin
FAskStop:=False;
try
try
For iCount:=0 to 4999 do
begin
FStartEnum:=True;
FCounterGuard.Enter; // FCounterGuard е TCriticalSection
try
Application.ProcessMessages;
if FAskStop then
begin
Exit;
end;
with TMyThread.Create(blah-blah) do
OnTerminate:=ThreadDone;
Inc(FRunningThreads);
finally
FCounterGuard.Leave;
end;
while FRunningThreads=MAX_ALLOWED_THREEADS do // 8 Threads
begin
Application.ProcessMessages;
Sleep(100);
end;
end;
except
// nothing
end;
finally
FStartEnum:=False;
end;
end;
procedure ThreadDone(Sender: TObject);
begin
FCounterGuard.Enter;
try
Dec(FRuningThreads);
//
// Blah-Blah-Blah
//
FInThreads:=(FRunningThreads>0) or FStartEnum;
finally
FCounterGuard.Leave;
end;
end;
От друга процедура, при "click" на бутон, някъде по средата на цикъла, присвоявам на FAskStop:=TRUE Според документацията, Exit би трябвало да предизвика спиране на for.. do и излизане от процедурата, без да нарушава try.. finally . Но при мен, Delphi 2010, това не се получава:
finally
FStartEnum:=False;
end;
никога не се извиква, при принудителен Exit
Някаква идея как да разреша този проблема?
|
| |
|
|
|