123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- {
- $Id$
- This file is part of the Free Component Library (FCL)
- Copyright (c) 1999-2000 by the Free Pascal development team
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {****************************************************************************}
- {* TThread *}
- {****************************************************************************}
- const
- Priorities: array [TThreadPriority] of word = ($100, $200, $207, $20F, $217,
- $21F, $300);
- ThreadCount: longint = 0;
- procedure AddThread (T: TThread);
- begin
- Inc (ThreadCount);
- end;
- procedure RemoveThread (T: TThread);
- begin
- Dec (ThreadCount);
- end;
- procedure TThread.CallOnTerminate;
- begin
- FOnTerminate (Self);
- end;
- 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
- DosGetInfoBlocks (@PTIB, nil);
- (*
- PTIB^.TIB2^.Priority := Priorities [Value];
- *)
- DosSetPriority (2, High (Priorities [Value]),
- Low (Priorities [Value]) - PTIB^.TIB2^.Priority, FHandle);
- end;
- procedure TThread.SetSuspended(Value: Boolean);
- begin
- if Value <> FSuspended then
- begin
- if Value then Suspend else Resume;
- end;
- end;
- procedure TThread.DoTerminate;
- begin
- if Assigned (FOnTerminate) then Synchronize (@CallOnTerminate);
- end;
- procedure TThread.Synchronize(Method: TThreadMethod);
- begin
- end;
- function ThreadProc(Args: pointer): Integer; cdecl;
- var
- FreeThread: Boolean;
- Thread: TThread absolute Args;
- 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
- inherited Create;
- AddThread (Self);
- FSuspended := CreateSuspended;
- Flags := dtStack_Commited;
- 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;
- destructor TThread.Destroy;
- begin
- if not FFinished and not Suspended then
- begin
- Terminate;
- WaitFor;
- end;
- if FHandle <> -1 then DosKillThread (FHandle);
- inherited Destroy;
- RemoveThread (Self);
- end;
- procedure TThread.Resume;
- begin
- FSuspended := not (DosResumeThread (FHandle) = 0);
- end;
- procedure TThread.Suspend;
- begin
- FSuspended := DosSuspendThread (FHandle) = 0;
- end;
- procedure TThread.Terminate;
- begin
- FTerminated := true;
- end;
- function TThread.WaitFor: Integer;
- begin
- WaitFor := DosWaitThread (FHandle, dtWait);
- end;
- {
- $Log$
- Revision 1.3 2000-12-19 00:43:07 hajny
- + FCL made compilable under OS/2
- Revision 1.2 2000/07/13 11:33:02 michael
- + removed logs
-
- }
|