ich verwende FPC 3.0.4 aus Debian stable-backports auf der Kommandozeile.
Mein Problem ist jetzt folgendes:
Ich habe ein Programm, dass ziemlich rabiates Numbercrunching macht. Diese Operationen habe ich erfolgreich auf zwei Threads verteilt, dann stellte ich fest, dass es ab einer gewissen Menge an Operanden sinnvoll ist, wenn der Workerthread sich noch einen Helperthread erstellt und dessen Ergebnisse zu seinen hinzufügt. Auch dass lief, solange die beiden Klassen im Source des Hauptprogramms standen. Da das Programm mittlerweile sehr länglich geraten ist, habe ich die funktionierenden Klassen in eine Unit ausgelagert.
Das Programm compiliert und startet, bricht aber mit einer Exception mit obiger Message ab. In der Folge ein Minimalbeispiel:
Code: Alles auswählen
{$mode objfpc}
unit mythreads;
interface
uses
{$ifdef unix}
cthreads,
cmem,
{$endif}
classes;
(* hier kaemen noch selbstgeschriebene Units fuer das Numbercrunching *)
type
THelperThread = class(TThread)
protected
procedure Execute; override;
end;
TWorkerThread = class(TThread)
protected
procedure Execute; override;
end;
implementation
procedure THelperThread.Execute;
begin
write(chr(10));
Terminate;
end;
procedure TWorkerThread.Execute;
var
lc : Byte;
ht : THelperThread;
begin
ht := THelperThread.Create(true);
for lc := 1 to 128 do
begin
write(lc:3);
ht.Start;
ht.WaitFor;
end;
ht.Destroy;
Terminate;
end;
End.
Und jetzt der Paarzeiler mit dem eingentlichen Programm:
Code: Alles auswählen
{$Mode objfpc}
program threadtst;
uses
{$ifdef unix}
cthreads,
cmem,
{$endif}
sysutils,
mythreads;
var
wt : TWorkerThread;
Begin
try
wt := TWorkerThread.Create(false);
wt.WaitFor;
wt.Destroy;
except
on e : Exception do
writeln(e.message);
end;
End.
Ich bedanke mich bereits vorab für mögliche Vorschläge.
Gruss,
jds