diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-07 20:34:49 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2008-06-07 20:34:49 +0200 |
| commit | ecde167da74c86bc047aaf84c5e548cf65a5da98 (patch) | |
| tree | a015dfda84f28a65811e3aa0d369f8f211ec8c60 /UGlibThreads.pas | |
| download | tuxcmd-0.6.36.tar.xz | |
Initial commitv0.6.36release-0.6.36-dev
Diffstat (limited to 'UGlibThreads.pas')
| -rw-r--r-- | UGlibThreads.pas | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/UGlibThreads.pas b/UGlibThreads.pas new file mode 100644 index 0000000..3d24afd --- /dev/null +++ b/UGlibThreads.pas @@ -0,0 +1,111 @@ +(* + Tux Commander - UGlibThreads - Threading support through the GLIB library + Copyright (C) 2007 Tomas Bzatek <tbzatek@users.sourceforge.net> + Check for updates on tuxcmd.sourceforge.net + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*) +unit UGlibThreads; + +interface + +uses glib2; + +// function xg_thread_supported(): gboolean; cdecl; external 'libgthread-2.0.so' name 'g_thread_supported'; +// function xg_thread_create(func: TGThreadFunc; data: gpointer; joinable: gboolean; error: PPGError): PGThread; external 'libgthread-2.0.so' name 'g_thread_create'; + + +type + TGlibThreadMethod = procedure of object; + + TGlibThread = class + private + FHandle: PGThread; + FCreateSuspended: Boolean; + FTerminated: Boolean; + FSuspended: Boolean; +// FFreeOnTerminate: Boolean; +// FFinished: Boolean; +// procedure SetSuspended(Value: Boolean); + protected +// procedure DoTerminate; virtual; + procedure Execute; virtual; abstract; + property Terminated: Boolean read FTerminated; + public + constructor Create(CreateSuspended: Boolean); + destructor Destroy; override; +// procedure AfterConstruction; override; + procedure Resume; +{ procedure Suspend; + procedure Terminate; + function WaitFor: LongWord; + property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate; + property Suspended: Boolean read FSuspended write SetSuspended; } + end; + + +implementation + +uses Classes, SysUtils, UCoreUtils; + +function xg_thread_func(data: gpointer): gpointer; cdecl; +begin + DebugMsg(['(II) TGlibThread.g_thread_func']); + try +{ if Assigned(data) and (TObject(data) is TGlibThread) + then TGlibThread(data).Execute + else DebugMsg(['(EE) TGlibThread.g_thread_func: wrong data argument']); } + except + on E: Exception do + DebugMsg(['(EE) TGlibThread.g_thread_func: Exception ', E.ClassName, ': ', E.Message]); + end; + Result := data; +end; + +constructor TGlibThread.Create(CreateSuspended: Boolean); +begin + DebugMsg(['(II) TGlibThread.Create']); + inherited Create; + FSuspended := CreateSuspended; + FCreateSuspended := CreateSuspended; + FHandle := nil; +end; + +destructor TGlibThread.Destroy; +begin + DebugMsg(['(II) TGlibThread.Destroy']); +{ if (FHandle <> nil) and not FFinished then + begin + Terminate; + if FCreateSuspended then + Resume; + WaitFor; + end; } + inherited Destroy; +end; + +procedure TGlibThread.Resume; +var err: PGError; +begin + DebugMsg(['(II) TGlibThread.Resume']); + err := nil; + FHandle := g_thread_create_full(@xg_thread_func, Self, 0, False, False, G_THREAD_PRIORITY_NORMAL, @err); + if FHandle = nil then DebugMsg(['(EE) TGlibThread.Resume: Error creating new thread: ', err.message]); +end; + + + +end. + |
