
| Subject: | I have an Thread, that terminates with this message: "Stack Overflow". |
| Posted by: | Jose Castillo Reyes (josecastillorey…@gmail.com) |
| Date: | Tue, 28 Apr 2009 |
Hello,
I have an Thread, that terminates with this message: "Stack Overflow".
Can you help me ?
My code is the following:
unit uHSensores;
interface
uses
Classes, Windows, uInterfacePerifericos, SysUtils;
type
TCallBackFunction = procedure(Data: String);
TSensoresThread = class(TThread)
private
CallBackProc : TCallBackFunction;
FData: String;
Procedure SendBackData;
procedure SensorReceiveCallBack(var Data: String);
protected
procedure Execute; override;
public
constructor Create(CreateSuspended : Boolean; ReturnProc :
TCallBackFunction);
end;
implementation
procedure TSensoresThread.SensorReceiveCallBack(var Data: String);
begin
// Put the data into a variable as I don't know how to get it to the
callback caller any other way
FData := Data;
Synchronize(SendBackData);
end;
constructor TSensoresThread.Create(CreateSuspended: Boolean; ReturnProc :
TCallBackFunction);
begin
Inherited Create(CreateSuspended);
CallBackProc := ReturnProc;
end;
procedure TSensoresThread.Execute;
var
event: _TIDevent;
Data: String;
begin
psf_sensor_init;
while not Terminated do
begin
Sleep(25);
// Verify sensor events
case psf_sensor_int(@event) of // <----- ERROR HERE, STACK OVERFLOW
1: // sensor_data:
begin
Data := 'Door:'+IntToStr(event.eventcode);
SensorReceiveCallBack(Data);
//Break;
end;
2: // error_sensor_door:
begin
Data := 'Error';
SensorReceiveCallBack(Data);
end;
end;
end;
end;
procedure TSensoresThread.SendBackData;
begin
// Call the parent app's callback function and give it some data
CallBackProc(FData);
end;
end.
This code is for Main unit:
unit Unit1;
interface
....
uses
...
type
_TIDevent = packed record
eventcode: Integer;
year: Integer; { since 2000 }
month: Integer; { 1 = Jan }
day: Integer; { 1 = 1st of month }
hour: Integer;
min: Integer;
sec: Integer;
end;
...
var
SensorThread: TSensoresThread; // Thread for Sensors
implementation
procedure reply_sensor(Data: String);
begin
if (Data <> '') then
fmain.MemoDEBUG.Lines.Append(Data);
end;
procedure TfMain.FormCreate(Sender: TObject);
begin
SensorThread := TSensoresThread.Create(True, reply_sensor);
SensorThread.Resume;
...
end;