(* Tux Commander - UGlibThreads - Threading support through the GLIB library Copyright (C) 2007 Tomas Bzatek 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.