I have an Thread, that terminates with this message: "Stack Overflow".

Giganews Newsgroups
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;

Replies