Баг TThread или TForm.ShowModal?

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

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

Баг TThread или TForm.ShowModal?

Сообщение Alexx2000 » 11.12.2006 03:01:13

Доброй ночи... Копирую значит в отдельном потоке, необходимо вывести запрос на замену файла. Так вот если вызываю из потока показ формы по ShowModal, форма появляется и исчезает, при этом поток прерывается.
Вот на более простом примере (код взят из примера multithreading в Lazarus плюс добавлен показ формы):
Код: Выделить всё
procedure TMyThread.Execute;
var
  newStatus : string;
begin
  fStatusText := 'TMyThread Starting...';
  Synchronize(@Showstatus);
  fStatusText := 'TMyThread Running...';
  while (not Terminated) and (true {any condition required}) do begin

    //here goes the code of the main thread loop
    newStatus:='TMyThread Time: '+FormatDateTime('YYYY-MM-DD HH:NN:SS',Now);
    {********************************}
    {Показываем модальную форму}
     with TForm.CreateNew(Form1,0) do
        ShowModal;

    {********************************}
    if NewStatus <> fStatusText then begin
      fStatusText := newStatus;
      Synchronize(@Showstatus);
    end;
  end;
end;



В Delphi такой же код работает без проблем. Что не так, как добиться нормальной работы?
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение serg_iv » 11.12.2006 13:39:43

Насколько помню, доступ к другим формам из потока (TThread) осуществляется только через метод Synchronize.
В Делфях кстати, он осуществляется именно так.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение Alexx2000 » 11.12.2006 17:28:02

Пробовал я и с помощью Synchronize показывать окно. При этом окно открывается, но выполнение потока продолжается. И соответственно открывается множество окон сразу.
Опять же в Delphi оба варианта работают нормально. Так как же мне приостановить поток и выдать окно с запросом?
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение serg_iv » 11.12.2006 18:58:04

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

Сообщение serg_iv » 11.12.2006 19:00:58

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

Сообщение Alexx2000 » 12.12.2006 01:51:32

serg_iv писал(а):Для управления потоками есть такие методы как resume и suspend.
Так это я знаю.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Сообщение Sergei I. Gorelkin » 12.12.2006 10:49:28

Как показывает практика, если форма появляется и исчезает - причиной тому скорее всего исключение где-то в недрах LCL. Это объясняет и прерывание потока.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Alexx2000 » 13.12.2006 00:12:41

Ну что ж, придется идти косвенным путем.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru