summaryrefslogtreecommitdiff
path: root/UGlibThreads.pas
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2008-06-07 20:34:49 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2008-06-07 20:34:49 +0200
commitecde167da74c86bc047aaf84c5e548cf65a5da98 (patch)
treea015dfda84f28a65811e3aa0d369f8f211ec8c60 /UGlibThreads.pas
downloadtuxcmd-0.6.36.tar.xz
Diffstat (limited to 'UGlibThreads.pas')
-rw-r--r--UGlibThreads.pas111
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.
+