Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Gif анимация в отдельном окне. Торомозит 
:(
    Опции темы
кмс
Дата 27.10.2014, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Здравствуйте.
Есть основная форма, в которой в основном потоке бывает частые подвисания(когда что то усердно делает 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;

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


PM MAIL   Вверх
Poseidon
Дата 27.10.2014, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
кмс
Дата 27.10.2014, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



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

PM MAIL   Вверх
Poseidon
Дата 27.10.2014, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Наврятли весь код так все грузит. Очень вероятно что все сведется к какому-то циклу или загрузке из сети. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Illusion Dolphin
Дата 28.10.2014, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Цитата

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

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


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
кмс
Дата 31.10.2014, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Промучился я эти дни с этой анимацией, так и не вышло 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, сообщений приходит много, но не то что нужно.
 
PM MAIL   Вверх
CynicRus
Дата 31.10.2014, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 2
Всего: 5



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 ловителя.

Это сообщение отредактировал(а) CynicRus - 31.10.2014, 11:54
PM MAIL   Вверх
кмс
Дата 31.10.2014, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



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

PM MAIL   Вверх
CynicRus
Дата 31.10.2014, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 2
Всего: 5



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

Да не за что-) А как же иначе, если код потока отрабатывает только в методе execute?smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.