Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Gif анимация в отдельном окне.


Автор: кмс 27.10.2014, 16:19
Здравствуйте.
Есть основная форма, в которой в основном потоке бывает частые подвисания(когда что то усердно делает smile )
Решил создать вторую форму на которой просто gif картинка которая как бы отображает что программа работает и нечего беспокоится.
Код

  Gif := TGIFImage.Create;
  RStream := TResourceStream.Create(HInstance, 'WaitGif', RT_RCDATA);
  Gif.LoadFromStream(RStream);
  Gif.Animate := True;
  Gif.AnimateLoop := glEnabled;
  Image1.Picture.Assign(Gif);
  Gif.Free;
  RStream.Free;

Но проблема в том что когда основная форма подвисает, то и анимация на второй тоже.
Можно как нибудь от этого избавиться?


Автор: Poseidon 27.10.2014, 20:40
Цитата(кмс @  27.10.2014,  16:19 Найти цитируемый пост)
Можно как нибудь от этого избавиться?
Можно. Использовать для расчетов (или что там программа усердно делает?) отдельный поток, а в основном потоке крутить анимацию.

Автор: кмс 27.10.2014, 21:43
Там тогда почти весь код придется в потоки сувать, ради одной анимашки не очень охота все переделывать.
Ладно, обойдусь без нее smile

Автор: Poseidon 27.10.2014, 22:55
Наврятли весь код так все грузит. Очень вероятно что все сведется к какому-то циклу или загрузке из сети. 

Автор: Illusion Dolphin 28.10.2014, 20:05
Цитата

Можно как нибудь от этого избавиться?

Да. Можно создать форму в отдельном потоке. При этом надо использовать WinAPI а не VCL.

Автор: кмс 31.10.2014, 10:08
Промучился я эти дни с этой анимацией, так и не вышло smile
У меня софт работает с ком портом, сперва пишет в порт, потом принимает данные и так может быть по многу раз.
Ожидание данных может достигать до 10 сек.

Решил отказаться от компонента для работы с портом(http://sourceforge.net/projects/comport/), нашел кучу примеров и даже как читать из порта в отдельном потоке.
Вроде все норм, пишет в порт и даже читает в потоке, но как передать считанные данные в другой поток не пойму.
В найденном примере это делается так:
Код

// Поток чтения из порта
........
ReadFile(cId, Buff, Kols, Kols, @Ovr);
........
........
........
PostMessage(fmMain.Handle, wm_User + $55, integer(Reciv),
     LenPacket);


Код

// Главный поток frmMain
  protected
    procedure RecivBytes(var Msg: TMessage); message wm_User + $55;
............
procedure TfmMain.RecivBytes(var Msg: TMessage);
var
  i, Cnt: integer;
  S: string;
  p: Pointer;
begin
  p := Pointer(Msg.WParam);
  S := 'Статус устройства - ' + IntToHex(word(p^), 4);
  Memo1.Lines.Add(S);
  FreeMem(Pointer(Msg.WParam));
end;


Но мне нужно передать в другой поток, по этому попробовал так
Код

 PostThreadMessage(MyAGThread.ThreadID, wm_User + $55,
    integer(Reciv), Kols);

Принимаю в другом потоке также как и в примере.
Код

procedure AGThread.RecivBytes(var Msg: TMessage);
........

Не получается smile, не приходят сообщения.
Так же пытался через GetMessage и PeekMessage, сообщений приходит много, но не то что нужно.
 

Автор: CynicRus 31.10.2014, 11:52
PostThreadMessage - спасёт отца русской демократии-)

Ну а ловить - как то так:
Код

procedure TMyThread.ProcessMessages;
var
  msg: TMsg;
  Temp: TMessage;
begin
  while PeekMessage(msg, INVALID_HANDLE_VALUE, 0, 0, PM_REMOVE) do
  begin
    Temp.Msg := msg.message;
    Temp.wParam := msg.wParam;
    Temp.lParam := msg.lParam;
    try
      Dispatch(Temp);
    except

    end;
  end;
end;
 - и периодически вызывай в Execute ловителя.

Автор: кмс 31.10.2014, 14:25
CynicRus, спасибо, заработало smile
Я в принципе там все и делал, единственно не знал что вызывать "ловителя" нужно обязательно их Execute.

Автор: CynicRus 31.10.2014, 22:01
Цитата(кмс @ 31.10.2014,  14:25)
CynicRus, спасибо, заработало smile
Я в принципе там все и делал, единственно не знал что вызывать "ловителя" нужно обязательно их Execute.

Да не за что-) А как же иначе, если код потока отрабатывает только в методе execute?smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)