timer в библиотеке

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

timer в библиотеке

Сообщение minoshi » 09.10.2015 08:08:14

Доброго времени суток!

Обнаружил очередной пробел в знаниях. Таймер, созданный в подключаемой библиотеке, не работает. Как заставить его работать?

Все пишется пока в MSE под Linux
Итак имеется библиотека (оставлены строки, относящиеся к вопросу):

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

type
  ttyp = class(tmsecomponent)
  private
    ttimer1 : ttimer;
    procedure on_timer(const sender: tobject);
  public
    constructor create;
  end; //class

var sp : ttyp;

constructor ttyp.create;
begin
  ttimer1 := ttimer.create(application);
  ttimer1.ontimer := @on_timer;
  ttimer1.interval := 100;
  ttimer1.enabled := true;
  inherited; 
end;

procedure ttyp.on_timer(const sender: tobject);
begin
  writeln('timer work!');     // <-- затык здесь, на консоль ничего не пишется, т.е таймер не работает. 
end;

procedure initlib(const app : tguiapplication);
begin
  sp := ttyp.create;

  with sp do
  begin     
  if ttimer1.enabled
     then writeln('timer  active')       // <--- на консоль идет эта строка, т.е таймер создан и активен
     else writeln('timer  not active');
  end;

end;

exports
     initlib;

begin
end.


ну и подключение :

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

procedure initlib(const app : tguiapplication); external 'libsomelib.so';

begin
  initlib(application);
  application.run;
end.


//текст исправлен с учетом замечания grot
Последний раз редактировалось minoshi 09.10.2015 11:04:48, всего редактировалось 2 раз(а).
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: timer в библиотеке

Сообщение grot » 09.10.2015 10:31:40

??? -> sp := tskinsupport.create;

tskinsupport - Это что и откуда ?

Создаешь одно - а хочешь, чтобы работало другое ?!?

Ну и напоследок :
ttimer1 := ttimer.create(application);
что за application ???
может быть лучше : nil (или Self) ?
grot
новенький
 
Сообщения: 75
Зарегистрирован: 13.02.2010 16:33:03

Re: timer в библиотеке

Сообщение minoshi » 09.10.2015 10:46:27

grot писал(а):??? -> sp := tskinsupport.create;
tskinsupport - Это что и откуда ?


Да, ошибся, когда писал, должен быть ttyp (первое сообщение поправил)

grot писал(а):Ну и напоследок :
ttimer1 := ttimer.create(application);
что за application ???
может быть лучше : nil (или Self) ?


не работает не c self, ни с nil, ни с application
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: timer в библиотеке

Сообщение alexs » 09.10.2015 11:16:58

Таймер завязан на LCL. И его реализация зависит от виджетов
Т.е. это должно быть или win32 или gtk2 или QT
Простое консольное приложение (и библиотека) работать не будет. Если не ошибкаюсь - NOGUI тоже не содержит реализации таймера.
Я в подобной ситуации использовал потоки.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: timer в библиотеке

Сообщение minoshi » 09.10.2015 11:48:56

alexs писал(а):Таймер завязан на LCL. И его реализация зависит от виджетов
Т.е. это должно быть или win32 или gtk2 или QT
Простое консольное приложение (и библиотека) работать не будет. Если не ошибкаюсь - NOGUI тоже не содержит реализации таймера.
Я в подобной ситуации использовал потоки.


Ну хорошо. А тогда почему, таймер не работает, если его внедрить на форму программы?

Код: Выделить всё
procedure initlib(const app : tguiapplication);
var  y : integer;
begin
   sp := ttyp.create;
   app.windows[0].owner.insertcomponent(sp.ttimer1);     //<-переносим timer на первую форму программы
  ...
     for y := 0 to app.windows[0].owner.componentcount - 1 do
          writeln('componentname='+twidget(app.windows[0].owner.components[y]).name); // <- выводим список компонентов, таймер в списке присутствует
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: timer в библиотеке

Сообщение alexs » 09.10.2015 14:35:46

Компоненты из DLL не стоит внедрять на форму программы. Это будет работать нормально только после того как FPC обзаведётся нормальной поддержкой пакетов (в стиле DELPHI) - чтобы RTL была общая.
Сейчас RTL разная у них.
Попробуй собрать DLL с поддержкой GUI - подключи модуль Interfaces первым в DLL и определи макрос LCLWidgetType:=win32 (для винды).
Может заработает.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: timer в библиотеке

Сообщение minoshi » 09.10.2015 14:47:17

Проект на MSE

пробывал подключить msegui.
не получилось

Пойду в конференцию Матрина пытать.
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: timer в библиотеке

Сообщение alexs » 09.10.2015 15:08:35

Для msegui надо наверное автора спрашивать :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru