|
@@ -15,84 +15,154 @@
|
|
{* TThread *}
|
|
{* TThread *}
|
|
{****************************************************************************}
|
|
{****************************************************************************}
|
|
|
|
|
|
|
|
+const
|
|
|
|
+ Priorities: array [TThreadPriority] of word = ($100, $200, $207, $20F, $217
|
|
|
|
+ $21F, $300);
|
|
|
|
|
|
-procedure TThread.CallOnTerminate;
|
|
|
|
|
|
|
|
|
|
+procedure AddThread;
|
|
begin
|
|
begin
|
|
|
|
+ Inc (ThreadCount);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-function TThread.GetPriority: TThreadPriority;
|
|
|
|
|
|
+procedure RemoveThread;
|
|
|
|
+begin
|
|
|
|
+ Dec (ThreadCount);
|
|
|
|
+end;
|
|
|
|
|
|
|
|
+
|
|
|
|
+procedure TThread.CallOnTerminate;
|
|
begin
|
|
begin
|
|
- GetPriority:=tpNormal;
|
|
|
|
|
|
+ FOnTerminate (Self);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-procedure TThread.SetPriority(Value: TThreadPriority);
|
|
|
|
|
|
+function TThread.GetPriority: TThreadPriority;
|
|
|
|
+var
|
|
|
|
+ PTIB: PThreadInfoBlock;
|
|
|
|
+ I: TThreadPriority;
|
|
|
|
+begin
|
|
|
|
+ DosGetInfoBlocks (@PTIB, nil);
|
|
|
|
+ with PTIB^.TIB2^ do
|
|
|
|
+ if Priority >= $300 then GetPriority := tpTimeCritical else
|
|
|
|
+ if Priority < $200 then GetPriority := tpIdle else
|
|
|
|
+ begin
|
|
|
|
+ I := Succ (Low (TThreadPriority));
|
|
|
|
+ while (I < High (TThreadPriority)) and
|
|
|
|
+ (Priority - Priorities [I] <= Priorities [Succ (I)] - Priority) do Inc (I);
|
|
|
|
+ GetPriority := I;
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
|
|
|
|
+
|
|
|
|
+procedure TThread.SetPriority(Value: TThreadPriority);
|
|
|
|
+var
|
|
|
|
+ PTIB: PThreadInfoBlock;
|
|
begin
|
|
begin
|
|
|
|
+ DosGetInfoBlocks (@PTIB, nil);
|
|
|
|
+(*
|
|
|
|
+ PTIB^.TIB2^.Priority := Priorities [Value];
|
|
|
|
+*)
|
|
|
|
+ DosSetPriority (2, High (Priorities [Value]),
|
|
|
|
+ Low (Priorities [Value]) - PTIB^.TIB2^.Priority, FHandle);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TThread.SetSuspended(Value: Boolean);
|
|
procedure TThread.SetSuspended(Value: Boolean);
|
|
-
|
|
|
|
begin
|
|
begin
|
|
|
|
+ if Value <> FSuspended then
|
|
|
|
+ begin
|
|
|
|
+ if Value then Suspend else Resume;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TThread.DoTerminate;
|
|
procedure TThread.DoTerminate;
|
|
-
|
|
|
|
begin
|
|
begin
|
|
|
|
+ if Assigned (FOnTerminate) then Synchronize (@CallOnTerminate);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TThread.Synchronize(Method: TThreadMethod);
|
|
procedure TThread.Synchronize(Method: TThreadMethod);
|
|
-
|
|
|
|
begin
|
|
begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-constructor TThread.Create(CreateSuspended: Boolean);
|
|
|
|
|
|
+function ThreadProc(Thread: TThread): Integer; cdecl;
|
|
|
|
+var
|
|
|
|
+ FreeThread: Boolean;
|
|
|
|
+begin
|
|
|
|
+ Thread.Execute;
|
|
|
|
+ FreeThread := Thread.FFreeOnTerminate;
|
|
|
|
+ Result := Thread.FReturnValue;
|
|
|
|
+ Thread.FFinished := True;
|
|
|
|
+ Thread.DoTerminate;
|
|
|
|
+ if FreeThread then Thread.Free;
|
|
|
|
+ DosExit (deThread, Result);
|
|
|
|
+end;
|
|
|
|
|
|
|
|
+constructor TThread.Create(CreateSuspended: Boolean);
|
|
|
|
+var
|
|
|
|
+ Flags: Integer;
|
|
begin
|
|
begin
|
|
|
|
+ inherited Create;
|
|
|
|
+ AddThread (Self);
|
|
|
|
+ FSuspended := CreateSuspended;
|
|
|
|
+ Flags := dtStack_Committed;
|
|
|
|
+ if FSuspended then Flags := Flags or dtSuspended;
|
|
|
|
+ if DosCreateThread (FThreadID, @ThreadProc, pointer (Self), Flags, 16384)
|
|
|
|
+ <> 0 then
|
|
|
|
+ begin
|
|
|
|
+ FFinished := true;
|
|
|
|
+ Destroy;
|
|
|
|
+ end else FHandle := FThreadID;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
destructor TThread.Destroy;
|
|
destructor TThread.Destroy;
|
|
-
|
|
|
|
begin
|
|
begin
|
|
|
|
+ if not FFinished and not Suspended then
|
|
|
|
+ begin
|
|
|
|
+ Terminate;
|
|
|
|
+ WaitFor;
|
|
|
|
+ end;
|
|
|
|
+ if FHandle <> -1 then DosKillThread (FHandle);
|
|
|
|
+ inherited Destroy;
|
|
|
|
+ RemoveThread (Self);
|
|
end;
|
|
end;
|
|
|
|
|
|
-
|
|
|
|
procedure TThread.Resume;
|
|
procedure TThread.Resume;
|
|
-
|
|
|
|
begin
|
|
begin
|
|
|
|
+ FSuspended := not (DosResumeThread (FHandle) = 0);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TThread.Suspend;
|
|
procedure TThread.Suspend;
|
|
-
|
|
|
|
begin
|
|
begin
|
|
|
|
+ FSuspended := DosSuspendThread (FHandle) = 0;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TThread.Terminate;
|
|
procedure TThread.Terminate;
|
|
-
|
|
|
|
begin
|
|
begin
|
|
|
|
+ FTerminated := true;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TThread.WaitFor: Integer;
|
|
function TThread.WaitFor: Integer;
|
|
|
|
|
|
begin
|
|
begin
|
|
- WaitFor:=0;
|
|
|
|
|
|
+ WaitFor := DosWaitThread (FHandle, dtWait);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.4 2000-01-07 01:24:34 peter
|
|
|
|
|
|
+ Revision 1.5 2000-04-01 10:45:52 hajny
|
|
|
|
+ OS/2 implementation started
|
|
|
|
+
|
|
|
|
+ Revision 1.4 2000/01/07 01:24:34 peter
|
|
* updated copyright to 2000
|
|
* updated copyright to 2000
|
|
|
|
|
|
Revision 1.3 2000/01/06 01:20:34 peter
|
|
Revision 1.3 2000/01/06 01:20:34 peter
|