поток lazarus linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

поток lazarus linux

Сообщение bloodvirus » 03.01.2011 15:44:16

Доброго времени суток товарищи..
Вот и решил я проблему с сборкой среды под лин. Все работает, но очередная проблема завела меня в тупик...

У меня консольное приложение.

Код: Выделить всё
program ReAnimate;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, Unit2
  { you can add units after this };

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  end;

{ TMyApplication }

procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
begin

  { add your program here }

  // stop program loop
  Terminate;
end;

constructor TMyApplication.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
end;

destructor TMyApplication.Destroy;
begin
  inherited Destroy;
end;

var
  Application: TMyApplication;
   ska : TMyThread;
{$R *.res}

begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='ReAnimate';
  Application.Run;
  ska:=TMyThread.Create(true);
   ska.Resume;
readln;
    Application.Free
end.


Сам поток

Код: Выделить всё
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;
Type
    TMyThread = class(TThread)
    private
     {prv}
    protected
      procedure Execute; override;
    public
      Constructor Create(CreateSuspended : boolean);
    end;

  implementation

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

   procedure TMyThread.Execute;
  begin

  end;
end.


// inherited Create(CreateSuspended); если это разкоментировать то после создания потока приложение сразу закроется..

Этот поток в упор не хочет работать =( Что бы я не написал в Execute это не выполняется..

что я сделал не так ?
http://wiki.lazarus.freepascal.org/Mult ... utorial/ru
инфу брал от суда...
bloodvirus
новенький
 
Сообщения: 17
Зарегистрирован: 22.12.2010 17:40:09

Re: поток lazarus linux

Сообщение serg_iv » 03.01.2011 18:07:14

в примерах вот так:

Код: Выделить всё
program MultiThreadingExample1;

{$mode objfpc}{$H+}

uses
  // for multi threading the cthreads unit must be used on unix systems:
  // for example: Linux, MacOSX, FreeBSD, Solaris
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, MainUnit;
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: поток lazarus linux

Сообщение bloodvirus » 03.01.2011 18:25:00

мое приложение консольное, если это что то скажет..
bloodvirus
новенький
 
Сообщения: 17
Зарегистрирован: 22.12.2010 17:40:09

Re: поток lazarus linux

Сообщение hinst » 03.01.2011 18:34:33

не надо вообще FreeOnTerminate ставить. это зло
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: поток lazarus linux

Сообщение bloodvirus » 03.01.2011 18:47:17

Если оставить

Код: Выделить всё
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

Type
    TMyThread = class(TThread)
    private

       protected

      procedure Execute; override;
    public

    end;

  implementation

  uses Unit1;


  procedure TMyThread.Execute;

  begin
  //
  end;

end.
     


то приложение сразу закроется после создания потока..
bloodvirus
новенький
 
Сообщения: 17
Зарегистрирован: 22.12.2010 17:40:09

Re: поток lazarus linux

Сообщение coyot.rush » 03.01.2011 21:06:15

1)
Код: Выделить всё
program ReAnimate;

{$mode objfpc}{$H+}
uses
{$IFDEF linux}
cthreads,
{$ENDIF}
Classes, SysUtils, CustApp, Unit2

2)
Код: Выделить всё
unit unit2;
{$mode objfpc}{$H+}
interface
uses
{$IFDEF LINUX}
cthreads,
{$ENDIF}
Classes, SysUtils;

3)
Код: Выделить всё
constructor TMyThread.Create(CreateSuspended : boolean);
begin
    inherited Create(CreateSuspended);
    FreeOnTerminate := True;   
end;


Комментарии 1) 2) шаблон генерируемый Lazarus не совсем корректен Unix и Linux имеют небольшие отличия в работе с потоками
3) Сначала вызываем конструктор TThread, а затем уже дописываем свой код
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: поток lazarus linux

Сообщение bloodvirus » 04.01.2011 03:00:18

если в поток добавить cthreads то компилится, запускается, вылетает..

вот полный код пустого проекта

Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, unit1
  { you can add units after this };

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  end;

{ TMyApplication }

procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
begin

  { add your program here }

  // stop program loop
  Terminate;
end;

constructor TMyApplication.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
end;

destructor TMyApplication.Destroy;
begin
  inherited Destroy;
end;

var
  Application: TMyApplication;
  tap:TMyThread;

{$R *.res}

begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  tap:=TMyThread.Create(true);
  tap.Resume;
  readln; 
Application.Free;
end.


и поток

Код: Выделить всё
unit unit1;
{$mode objfpc}{$H+}
interface
uses
{$IFDEF LINUX}
cthreads,
{$ENDIF}
Classes, SysUtils;



Type
   TMyThread = class(TThread)
   private

   protected
     procedure Execute; override;
   public
     Constructor Create(CreateSuspended : boolean);
   end;


   implementation



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

end;


procedure TMyThread.Execute;
  begin
  writeln('robyt');
end;


end.
               

если закоментить cthreads и inherited Create(CreateSuspended); то откомпилится, запустится но не будет работать.. если хоть одно из этого не будет закоментированно - будет компилится, запускаться и сразу закрываться..
Может я в упор чего то не то делаю.....
bloodvirus
новенький
 
Сообщения: 17
Зарегистрирован: 22.12.2010 17:40:09

Re: поток lazarus linux

Сообщение coyot.rush » 04.01.2011 03:24:27

Может я в упор чего то не то делаю.....

см пункт 1)
Код: Выделить всё
{$IFDEF UNIX}{$IFDEF UseCThreads}

PS под fpc 2.4.2 всё нормально работает
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Рейтинг@Mail.ru