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.