Проблема с методом Synchronize в классе-наследнике TThread

Форум для изучающих FPC и их учителей.

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

Проблема с методом Synchronize в классе-наследнике TThread

Сообщение ya_vanka » 15.01.2014 17:15:04

Добрый день.

Столкнулся с проблемой: не вызывается метод ссылка на который предается как параметр метода Synchronize.

Т.е. в procedure TLoadMapThread.Execute; вызывается Synchronize(@GenerateTexRoutine);
Но сам метод procedure TLoadMapThread.GenerateTexRoutine; не вызыватся (точка останова не срабатывает).

В чем может быть дело?

В другом маленьком проекте все работает.


На всякий случай весь модуль с потоком:

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

interface

uses
  Classes, SysUtils;


type
  TLoadMapThread = class(TThread)

  private
    x : integer;

  protected
    procedure Execute; override;

    procedure GenerateTexRoutine;

  public
    FileName : string;

    ThreadUpdateProgressExtProc, ThreadTerminatedExtProc : TNotifyEvent;

    CurrProgress : byte;
    SleepTime, MinSleepInterval, MinProgressBarInc : word;
    LoadStartTime : TDateTime;


    constructor Create(FileNamePrm : string; MapListPrm : Pointer);
  end;


implementation

uses
  Dialogs, Math;


constructor TLoadMapThread.Create(FileNamePrm : string; MapListPrm : Pointer);
begin
  inherited Create(false{, FileNamePrm});

  x := 0;
end;


procedure TLoadMapThread.Execute;
begin
  while not(Terminated) and (x < 100) do
  begin
    sleep(10);
    Synchronize({$IFDEF FPC}@{$ENDIF}GenerateTexRoutine);
  end;
end;


procedure TLoadMapThread.GenerateTexRoutine;
begin
  x := x + 1;
end;

end.


Добавлено спустя 4 минуты 44 секунды:
При этом тот же код откомпилированный в Delphi работает правильно, с заходом в метод GenerateTexRoutine.

И еще: строчка Synchronize({$IFDEF FPC}@{$ENDIF}GenerateTexRoutine); выполняется только один раз. Т.е. после выполнения этой строчки как будто исключение происходит, но никаких сообщений не выводится.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Проблема с методом Synchronize в классе-наследнике TThre

Сообщение ya_vanka » 17.01.2014 12:06:35

Перелопатил форум, нашел упоминание о том, что "Synchronize перестаёт работать, если приложение не использует библиотеку VCL": viewtopic.php?f=5&t=5102&p=36321&hilit=synchronize#p36321

Проверил и действительно, если поток создается в проекте с LCL формами, то Synchronize работает, если нет - не работает :( (Хотя в Delphi 2010 Synchronize работает и без форм).
Предложенный пример (ThreadStuffU.zip) не работает в FPC.

Может кто знает чем заменить Synchronize или как заставить его работать?

Добавлено спустя 2 часа 19 минут 45 секунд:
Re: Проблема с методом Synchronize в классе-наследнике TThread
Аналогичная ситуация и с TLoadMapThread.OnTerminate.
В проекте без LCL OnTerminate не отрабатывает, а с LCL отрабатывает...
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Проблема с методом Synchronize в классе-наследнике TThre

Сообщение Mirage » 18.01.2014 12:14:32

Метод TThread.Synchronize() берет аргумент и засовывает его в какую-то очередь. Видимо, глобальную. Чего не сделаешь для совместимости.:)
Очевидно, для того, чтобы он работал, из этой очереди надо элементы выбирать и обрабатывать. Что и делает основной поток в VCL и LCL. Это который TApplication.Run(). Можно делать это самостоятельно в своем потоке. Только просигнализировать треду вызвавшему Synchronize надо не забыть.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Проблема с методом Synchronize в классе-наследнике TThre

Сообщение wavebvg » 20.01.2014 09:25:52

По сути, он должен синхронизироваться с главным потоком, когда тот передается управление очереди событий (Application.Run, к примеру). Т.е. сам Application тут не нужен.
Нужно, чтобы основной поток обработал собщения из очереди. Самый простой способ - подключить LCL, если вопрос принципиальный, можно самостоятельно обработать сообщения из очереди.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35


Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru