als Fingerübung hab ich mir mal die Programmierung mit threads angesehen - Plattform Windows.
Tutorial http://wiki.freepascal.org/Multithreade ... utorial/de gelesen, und spätestens seit http://www.lazarusforum.de/viewtopic.php?f=10&t=5372 ist mir auch klar, warum mein thread beim ersten synchronize(...) hängen blieb.
Aber: Was auch nicht funktioniert ist die Benutzung der unit crt.
Sobald ich crt benutze werden im Konsolenfenster nur noch Leerzeichen ausgegeben!
Ich hab gedacht ich könnte mal in crt reingucken um zu sehen was schiefläuft, aber irgendwie funtionieren Breaktpoints in crt grundsätzlich nicht (nicht mal im "Hautpprogramm"/Initialization-Abschnitt) - mach ich da was grundsätzlich falsch?
Beispielprogramm s.u., entspricht weitestgehend dem Beispiel aus dem Tutorial, nur halt ohne GUI.
Achso, nur am Rande - mir ist klar, dass StatusText korrumpiert werden könnte.
NACHTRAG: Unter Linux tritt das Problem nicht auf.
Gruß, Ingo
Code: Alles auswählen
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp, Crt,
Unit1;
type
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
end;
procedure TMyApplication.DoRun;
var
ErrorMsg: String;
oldTime, newTime : TDateTime;
MyThread : TMyThread;
begin
MyThread := TMyThread.Create(false);
oldTime := Now;
repeat
newTime := Now;
if newTime >= oldTime + 1/24/3600 then begin
Write(#13, DateTimeToStr(newTime), ' ', MyThread.StatusText, ' ');
oldTime := newTime;
end else Sleep(1000 - Round((newTime - oldTime) * 24*3600*1000));
until false; //keypressed;
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
var
Application: TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
Type
TShowStatusEvent = procedure(Status: String) of Object;
TMyThread = class(TThread)
private
protected
procedure Execute; override;
public
StatusText : string;
Constructor Create(CreateSuspended : boolean);
end;
implementation
constructor TMyThread.Create(CreateSuspended : boolean);
begin
FreeOnTerminate := True;
inherited Create(CreateSuspended);
end;
procedure TMyThread.Execute;
var
i : longint;
begin
while not Terminated do begin
Inc(i);
if i MOD 100000000 = 0 then
StatusText := ' Counted to ' + IntToStr(i) + '!';
end;
end;
end.