2

Windows ではスレッドを使用してアプリケーションを実行すると問題が発生しますが、Linux Ubuntu 12.04 で実行するとアプリがクラッシュします。

スレッドを理解するだけの非常に小さなアプリです。

スレッドが作成されると、アプリがクラッシュします。

コードは次のとおりです。

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls;

type

{ TMyThread }

  TMyThread = class(TThread)
  private
    fStatusText: string;
    procedure CambiaLabel();
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: boolean);
  end;

{ TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
     miHilo: TThread;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TMyThread }
procedure TMyThread.CambiaLabel();
begin
    Form1.Label1.Caption:=fStatusText;

    Form1.ProgressBar1.StepIt;

    if Form1.ProgressBar1.Position = Form1.ProgressBar1.Max then begin
       Form1.miHilo.Terminate;
       Form1.ProgressBar1.Position := 0;
    end;
end;

procedure TMyThread.Execute;
var
  newStatus : string;
begin
  fStatusText := 'TMyThread comenzando...';
  fStatusText := 'TMyThread Corriendo ...';
  while (not Terminated) and (true {any condition required}) do begin

    //here goes the code of the main thread loop

    Synchronize(@CambiaLabel);

  end;
end;

constructor TMyThread.Create(CreateSuspended: boolean);
begin
  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin

  if miHilo <> nil then begin
    ShowMessage('Ya se esta ejecutando');
  end
  else begin
    miHilo := TMyThread.Create(false);
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   if miHilo <> nil then begin
     miHilo.Terminate;
     ShowMessage('Hilo terminado');
     miHilo:=nil;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

ここにエラーメッセージの画像があります: error message image

4

1 に答える 1

2

解決策を見つけました。プロジェクトの .lpr ファイルに何かがありませんでした。Linux、OsX、freebsd などの OS Unix のスレッドを使用しているため、.lpr ファイルに次の行を追加する必要がありました。

これは通常のファイルです。

program project1;

{$mode objfpc}{$H+}


uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };
  .
  .
  .

これは{$define UseCThreads}を追加する必要がある行です

したがって、ファイルは次のようになります。

プログラム project1;

{$mode objfpc}{$H+}
{$define UseCThreads}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };
  .
  .
  .

答えとヒントに感謝します;D

于 2012-10-05T03:40:48.670 に答える