TThread Programmabsturz bei Create?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

TThread Programmabsturz bei Create?

Beitrag von MmVisual »

Hallo,

Ich habe Linux, Sidux (Debian) ganz frisch installiert und wollte die ersten Versuche mit Lazarus unter Linux machen (sidux läuft in der VirtualBox von Sun). Dazu habe ich ein Win/Lazarus Projekt genommen und unter Linux kompilliert.
Beim Start sürzt aber das Programm bei Thread Create "inherited Create(...);" ab.

Anbei ein völlig simples Programm, ein Formular, ein Button, da drauf drücken und es sollte ein TThread entstehen, tatsächlich stürt es aber bei der Zeile "inherited Create(ASuspended);" ab.

Lazarus sagt beim Debuggen:
"Project raised exception class 'RunError(232)'."
und dann
"Ausführung angehalten Adresse: $0806706C Prozedur: SYSTEM_NOTHREADERROR Datei: (TODO: Assembler-Asnicht an dieser Stelle"
und dann
"Ausführung angehalten Adresse: $08064C73 Prozedur: SYSTEM_RUNERROR$WORD Datei: (TODO: Assembler-Asnicht an dieser Stelle"

Also Programme ohne Threads funktionieren.

Ich habe Lazarus folgendermasen installiert (Konsole-Befehle):
apt-get install fpc
apt-get install fpc-source
apt-get install fp-units-i386
apt-get install fp-utils
apt-get install fp-docs
apt-get install lazarus
apt-get install gdb

Hab ich da was falsch gemacht? Oder muss ich noch mehr Pakete installieren? Oder hab ich da was falsch programmiert (unit vergessen)?

Vielen Dank für eure Hilfe, Gruß Markus.

Anbei der Code des Test-Programmes:

Code: Alles auswählen

 
unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create(ASuspended: boolean);
  End;
 
var
  Form1: TForm1; 
  th: TMyThread;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  If Not Assigned(th) Then
  	  th := TMyThread.Create(False);
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
   If Assigned(th) Then
   Begin
      th.Terminate;
      Application.ProcessMessages;
      th.WaitFor;
      th.Free;
   End;
end;
 
 
constructor TMyThread.Create(ASuspended: boolean);
Begin
   inherited Create(ASuspended);
   FreeOnTerminate := False;
End;
 
procedure TMyThread.Execute;
Begin
   Repeat
      Sleep(100);
   Until Terminated;
End;
 
initialization
  {$I unit1.lrs}
 
end.
 
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: TThread Programmabsturz bei Create?

Beitrag von theo »

Wiki lesen

http://wiki.freepascal.org/Multithreade ... igte_Units" onclick="window.open(this.href);return false;

marcov
Beiträge: 1103
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TThread Programmabsturz bei Create?

Beitrag von marcov »

MmVisual hat geschrieben:Hallo,

Ich habe Linux, Sidux (Debian) ganz frisch installiert und wollte die ersten Versuche mit Lazarus unter Linux machen (sidux läuft in der VirtualBox von Sun). Dazu habe ich ein Win/Lazarus Projekt genommen und unter Linux kompilliert.
Beim Start sürzt aber das Programm bei Thread Create "inherited Create(...);" ab.

Anbei ein völlig simples Programm, ein Formular, ein Button, da drauf drücken und es sollte ein TThread entstehen, tatsächlich stürt es aber bei der Zeile "inherited Create(ASuspended);" ab.

Lazarus sagt beim Debuggen:
"Project raised exception class 'RunError(232)'."

und dann
"Ausführung angehalten Adresse: $0806706C Prozedur: SYSTEM_NOTHREADERROR Datei: (TODO: Assembler-Asnicht an dieser Stelle"
Das ist ein FAQ, siehe http://wiki.freepascal.org/Lazarus_Faq" onclick="window.open(this.href);return false;

In kurzem: addiere unit cthreads zu deinen Mainprogram.

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TThread Programmabsturz bei Create?

Beitrag von MmVisual »

Vielen Dank für die schnelle Info!

Das Main-Programm sieht so aus:

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, Unit1;
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Dann fehl wohl noch in den Projekteinstellungen das "UseCThreads".

Der einfachheit halber hab ich die Buchstaben "{$IFDEF UseCThreads}" gelöscht...
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten