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