Понедельник, 25 Ноября 2024, 15:35

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[C#] Не нужная заморозка gif изображения в главном потоке
zacДата: Воскресенье, 01 Декабря 2013, 17:02 | Сообщение # 1
участник
Сейчас нет на сайте
Здравствуйте, форумчане!
Примерно недели две назад начал делать свой клиент для ВК, чтобы появились знания об их api, да и сама идея не такая уж и плоха.
А сама проблема такова - в момент выставления значений у элементов (label.Text = variable и т.д) юзеру показывается gif анимация загрузки (просто перед выставлением значений появляется panel с PictureBox - gif анимация), но этот же Picturebox "замерзает" и начинает "бегать" только после того, как всё выставится...
Надеюсь, что я изъяснил проблему нормально.
Скажите, как можно это решить? Я уже запихнул всё что можно в отдельный поток, где переменные загружаются из веба.
EchoITДата: Воскресенье, 01 Декабря 2013, 18:14 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата
Скажите, как можно это решить? Я уже запихнул всё что можно в отдельный поток, где переменные загружаются из веба.

В отдельный поток и надо, значит, неправильно запихнул. smile


Долгожданный анонсик: State of War
zacДата: Воскресенье, 01 Декабря 2013, 18:33 | Сообщение # 3
участник
Сейчас нет на сайте
Цитата EchoIT ()
EchoIT


Я знаю как добавить PB через отдельный поток только так :

Код

private void bg_loadAccount_DoWork(object sender, DoWorkEventArgs e)
{
myPanel = ...;
myPB = ...;
this.controls.add(myPanel);
this.controls.add(myPB);
myPanel.controls.add(myPB);
}


, поэтому он выдаёт ошибку, что поток другой...

Какой ещё вариант?

Добавлено (01.12.2013, 18:33)
---------------------------------------------
Хорошо, объясню немного по-другому..

В проекте используются 2 void'a : AccountLoadInformation и AccountWriteInformation.
AccountLoadInformation загружает информацию из api VK в глобальные переменные, а AccountWriteInformation это дело всё записывает в controls формы.
Первый цикл выполняет своё дело в отдельном потоке, поэтому он не мешается, а после его завершения вызывается AccountWriteInformation, а т.к этот цикл нельзя выполнять в отдельном потоке (из-за this.label.Text = DatAss;) , он выполняется в основном потоке.
Вот и в этом проблема : его нельзя выполнить в отдельном потоке (с моими знаниями о языке), вот он и "фризит" на 2 секунды приложение, заодно и gif анимацию загрузки.
Хелп ми, плизз!

RikettaДата: Воскресенье, 01 Декабря 2013, 19:21 | Сообщение # 4
Strategist
Сейчас нет на сайте
Разрешить обращаться к контролам из другого потока:
Код
CheckForIllegalCrossThreadCalls = false; // Разрешить обращаться к контролам из других потоков

Не панацея, но должно работать.


Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack
zacДата: Воскресенье, 01 Декабря 2013, 19:22 | Сообщение # 5
участник
Сейчас нет на сайте
Цитата Riketta ()
Riketta

Спасибо, сейчас проверю...
RikettaДата: Воскресенье, 01 Декабря 2013, 19:28 | Сообщение # 6
Strategist
Сейчас нет на сайте
Еще как вариант использовать свойства и с их помощью, как через "посредника" изменять и получать данные между разными потоками.
Вот это уже более правильно, нежели мой предыдущий совет.


Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack
zacДата: Воскресенье, 01 Декабря 2013, 19:30 | Сообщение # 7
участник
Сейчас нет на сайте
Цитата Riketta ()
Riketta

Проверю и его, потому что ваш вариант почему-то не работает...



И пожалуйста, дайте правильную ссылку, а то не работает...


Сообщение отредактировал zac - Воскресенье, 01 Декабря 2013, 19:31
RikettaДата: Воскресенье, 01 Декабря 2013, 19:34 | Сообщение # 8
Strategist
Сейчас нет на сайте
Свойства. Википедия
Да что же такое. Не дружит почему-то джиси с моими кириллическими ссылками.


Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack


Сообщение отредактировал Riketta - Воскресенье, 01 Декабря 2013, 19:36
zacДата: Воскресенье, 01 Декабря 2013, 19:36 | Сообщение # 9
участник
Сейчас нет на сайте
Цитата Riketta ()
Свойства. Википедия

Что-то тут не так...
RikettaДата: Воскресенье, 01 Декабря 2013, 19:37 | Сообщение # 10
Strategist
Сейчас нет на сайте
Исправил ссылку, клик еще раз
И ту штуку перед инициализацией формы вставьте:
Код
CheckForIllegalCrossThreadCalls = false;
Init();


Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack


Сообщение отредактировал Riketta - Воскресенье, 01 Декабря 2013, 19:44
zacДата: Воскресенье, 01 Декабря 2013, 19:47 | Сообщение # 11
участник
Сейчас нет на сайте
Я понял, что вы имели в виду, но это не подходит к данному случаю, ведь чтобы установить value у label в controls формы, нужно использовать главный поток.. Я же прав?

Добавлено (01.12.2013, 19:47)
---------------------------------------------
А что за "Init();"?

Пишет, что нет такого цикла...

Код

         public MainWindow()
         {
             CheckForIllegalCrossThreadCalls = false;
             Init();
             InitializeComponent();
         }
RikettaДата: Воскресенье, 01 Декабря 2013, 19:49 | Сообщение # 12
Strategist
Сейчас нет на сайте
Обращаетесь к свойству, определенному в главном потоке из любого потока, свойство меняет значение контрола, к которому оно привязано.
Разве не так?

"Init". Это я так сократил InitializeComponent(); Хех.)

Цитата
установить value у label

Быть может вы имели ввиду text? Потому что не вижу никакого смысла менять value


Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack


Сообщение отредактировал Riketta - Воскресенье, 01 Декабря 2013, 19:56
zacДата: Воскресенье, 01 Декабря 2013, 20:00 | Сообщение # 13
участник
Сейчас нет на сайте
Цитата Riketta ()
Обращаетесь к свойству, определенному в главном потоке из любого потока, свойство меняет значение контрола, к которому оно привязано.
Разве не так?


Извиняюсь за нубство, но как именно обращаться со свойством в этом случае?

Код
   
   void WriteAccountInformation(String UserId)
          {
     //куча кода
this.username.Text = FirstName;
          }

          void LoadAccount(string userId)
          {
              CurTarget = userId;

              this.panel_loading.BringToFront();

              this.bg_loadAccount.RunWorkerAsync();
          }

         private void bg_loadAccount_DoWork(object sender, DoWorkEventArgs e)
          {
              Panel loading_panel = new Panel(){Dock = DockStyle.Fill, Location = new Point(0,0), BackColor = Color.FromArgb(255, 51, 62, 75)};
              PictureBox loading_icon = new PictureBox() { Image = Properties.Resources.loading, Location = new Point(0,0), SizeMode = PictureBoxSizeMode.AutoSize };
              loading_panel.Controls.Add(loading_icon);
                
              this.Controls.Add(loading_panel);

              LoadAccountInformation(CurTarget);
          }

          private void bg_loadAccount_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
          {
              WriteAccountInformation(CurTarget);
              this.loading_timer.Enabled = true;
          }


Где именно нужно заморачиваться с этим свойством?


Сообщение отредактировал zac - Воскресенье, 01 Декабря 2013, 20:01
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг