TThread в Линуксе

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

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

Ответить
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

TThread в Линуксе

Сообщение serg_iv »

Подскажите пожалуйста почему без всяких объявлений падает программа с использованием TThread в Линуксе?

при нажатии кнопки запуска еще одного потока

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

procedure TForm1.Button1Click(Sender: TObject);
begin

  pot := Potok.Create(false);
 
end;

программа просто падает. (Хотя компилируется)

Дополнительный поток:

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

uses
  Classes, SysUtils;

type
 
Potok = class(TThread)
    protected
    procedure Execute; override;
    end;

implementation

uses unit1;

procedure Potok.Execute;
begin
  repeat
    sleep(10);
    inc(i);
  until Terminated;
end;

end.
SergKam
постоялец
Сообщения: 251
Зарегистрирован: 16.11.2005 20:31:11
Откуда: Украина,Харьков

Сообщение SergKam »

во первых какая версия всего, операционка?
во вторых попробуй в папке lazarus/exaples/multitreading откомпелить и запустить пример. потом сообщи
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

Спасибо за то, что тыкнули меня носом в то, что лежит у меня под носом. Помогло.
Но тем не менее выше приведенный пример работает в Винде, а в Линуксе отказывается.
SergKam
постоялец
Сообщения: 251
Зарегистрирован: 16.11.2005 20:31:11
Откуда: Украина,Харьков

Сообщение SergKam »

во первых какая версия всего, операционка?

а примеры в линуксе работают?
Я подоздеваю что ты в проекте не указал в
uses ctreads или ptreads
другая потенциальная проблема это sleep он завязан на сигналы
а это обычно проблнмы. попробуй для примера чтото другое
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

во первых какая версия всего, операционка?[

0.9.18, Mandriva 2007.

а примеры в линуксе работают?

Да.

Я подоздеваю что ты в проекте не указал в
uses ctreads или ptreads

вручную не указывал, если оно автоматом не прописывается, то точно нет.

другая потенциальная проблема это sleep он завязан на сигналы
а это обычно проблнмы. попробуй для примера чтото другое

Нужно отмерять короткие промежутки времени, не загружая систему, чем?
Желательно с точностью 2 миллисекунды.

[/quote]
SergKam
постоялец
Сообщения: 251
Зарегистрирован: 16.11.2005 20:31:11
Откуда: Украина,Харьков

Сообщение SergKam »

скорее всего uses ctreads. смотри в примере(главный модуль проекта аля *.dpr)
>Нужно отмерять короткие промежутки времени, не загружая систему, чем?
если и впримере sleep работает тогда не в нем дело.(есть еще libc.usleep)
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

libc.usleep

в uses прописывается или отдельная библиотека?
SergKam
постоялец
Сообщения: 251
Зарегистрирован: 16.11.2005 20:31:11
Откуда: Украина,Харьков

Сообщение SergKam »

в uses libc;
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

кстати про нерабочий пример, вот этот код стоит в головном модуле.

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

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  {$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { add your units here }, Unit1, unit2;
 


закоментировав вот так, пример удачно скомпилировался:

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

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  //{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}//{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { add your units here }, Unit1, unit2;


а вот что за директива {$IFDEF UseCThreads} не знаю.
Получилось, что методом научного тыка я ее отключил, а за что она отвечает так и не понял.
Ответить