Witam.
Mam problem z dynamicznym wywoływaniem wątków. Problem tkwi w tym że nie można wywołać tak wątku (funkcja jest tylko po to by mi ID Thread'a zwracała kontrolnie)
RegisterThread('TEST','001',True,CMDConsole);
bo jest niezgodność typów.
Nie mogę dać CMDConsole zamiast TThread bo by się odwoływało tylko do tego jednego rodzaju wątku a ja w późniejszym czasie chcę dodać ich kilkanaście jak nie więcej...
Co do tworzenia wątków to każdy ma stałe procedury Create i Destroy.
W tablicy rekordu umieszczam ID (PID), Handle - Tu ma się umieszczać ID i wywołany wątek by można było swobodnie nim później operować na bazowych procedurach ew funkcjach które dojdą później (Create i Destroy itp)
uses
QCMDConsole;
type RThreadNFO = record
PID:Integer;
Name:String;
Title:String;
Handle:TThread;
Active:Boolean;
end;
var
TThreadTBL : array of RThreadNFO;
function TBodyForm.RegisterThread(Name,Title:String;Mode:Boolean;CThread:TThread):Integer;
var
I : Integer;
begin
for I := 0 to High(TThreadTBL) do
if TThreadTBL[I].Active = False then Break;
if I > High(TThreadTBL) then SetLength(TThreadTBL,High(TThreadTBL)+2);
I:=High(TThreadTBL);
TThreadTBL[I].PID:=I;
TThreadTBL[I].Name:=Name;
TThreadTBL[I].Title:=Title;
TThreadTBL[I].Handle:=CThread.Create(Mode);
TThreadTBL[I].Active:=True;
Result:=TThreadTBL[I].PID;
end;
Co do Wątku to wygląda tak
unit QCMDConsole;
interface
uses
Dialogs,Windows, Messages, SysUtils, Classes, UnitedCMD;
const
CMD_REFRESH = 300;
type
CMDConsole = class(TThread)
private
FThreadID : THandle;
FProcessID : Integer;
CMD : TUnitedCMD;
procedure EventRevData(Sender:TObject;Data:String);
procedure SetName;
protected
public
constructor Create(Mode:Boolean);
destructor Destroy; override;
procedure Execute; override;
procedure Command(Data:String);
property PID: Integer read FProcessID;
property ThreadID :THandle read FThreadID;
end;
implementation
{$IFDEF MSWINDOWS}
type
TThreadNameInfo = record
FType: LongWord; // must be 0x1000
FName: PChar; // pointer to name (in user address space)
FThreadID: LongWord; // thread ID (-1 indicates caller thread)
FFlags: LongWord; // reserved for future use, must be zero
end;
{$ENDIF}
{ CMDConsole }
procedure CMDConsole.SetName;
{$IFDEF MSWINDOWS}
var
ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
ThreadNameInfo.FType := $1000;
ThreadNameInfo.FName := 'CMDConsole';
ThreadNameInfo.FThreadID := $FFFFFFFF;
ThreadNameInfo.FFlags := 0;
try
RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
except
end;
{$ENDIF}
end;
constructor CMDConsole.Create(Mode:Boolean);
begin
inherited Create(Mode);
CMD := TUnitedCMD.Create(CMD);
CMD.Refresh := CMD_REFRESH;
CMD.OnData := EventRevData;
CMD.Activ := True;
end;
destructor CMDConsole.Destroy;
begin
CMD.Activ:=False;
CMD.Free;
end;
procedure CMDConsole.Command(Data:String);
begin
CMD.SendCommand(Data);
end;
procedure CMDConsole.EventRevData(Sender:TObject;Data:String);
begin
ShowMessage(Data);
end;
procedure CMDConsole.Execute;
begin
SetName;
{ Place thread code here }
end;
end.
Wątek w całości działa poprawnie bo już go testowałem statycznie.
Jak by ktoś mógł pomóc w rozwiązaniu problemu był bym wdzięczny, bo wujek google nie dał żadnych rezultatów.