Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2011, 10:05   #1
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
По умолчанию Безопасное отображение статуса в программе (многопоточной)

Доброго времени суток.

Интересует вопрос, как отображать текущий статус работы программы, если используется многопоточность.

Допустим, label1 - строка статуса.

Из потока вызов делается сл. образом:

Код:
crit.enter; // criticalsection
form1.label1.caption := 'state';
crit.leave;
Возникает проблема - программа неумолимо виснет (когда раньше, когда позже). При использовании statusBar вроде бы проблемы нет, но его использовать не могу по ряду причин.

При таком вызове -
Код:
synchronize (procedure 
begin 
form1.label1.caption := 'state';
end);
... подвисает головная форма, а application.processmessages каждый раз вызывать ну совсем не здорово.

Как выйти из ситуации?

Заранее спасибо за ответы.
Puhovoi вне форума Ответить с цитированием
Старый 29.01.2011, 11:48   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Из потока вызов делается сл. образом:
Критическую секцию нафиг, любой код, работающий с VCL, заворачивам в процедуру, вызываем эту процедуру через TThread.Synchronize();

Цитата:
подвисает головная форма
Нечему там подвисать, ищите косяки у себя.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 29.01.2011 в 11:50.
veniside вне форума Ответить с цитированием
Старый 29.01.2011, 12:15   #3
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
По умолчанию

Весьма странно. Попробовал вышеприведенный код (2) - все заработало, ничего не виснет, хотя ранее были явные проблемы (видимо, при количестве потоков больше тысячи обращение к synchronize были крайне частыми, поэтому форма подвисала).
Puhovoi вне форума Ответить с цитированием
Старый 29.01.2011, 12:29   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Puhovoi Посмотреть сообщение
при количестве потоков больше тысячи
хм.. самое время, имхо, что-то пересмотреть в программе. Я не говорю, что число потоков должно быть обязательно = число ядер * количество процов + 1, но к этому надо стремиться. У самого бывает до 50 потоков, но > 1000.. И они все ломятся обновлять статус? Synchronize() и так не самый удачный костыль для использования, а если вызывать его из 1000 потоков, это будет просто марш инвалидов какой-то.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
безопасное извлечение флешки Лонли-Локли Общие вопросы Delphi 4 22.02.2022 23:06
Безопасное извлечение устройства Xardas Компьютерное железо 7 28.02.2011 00:49
Многопоточной апплет J.Bond Помощь студентам 0 23.11.2010 09:06
Отображение VRML в программе на Visual C++ AsMasteR Общие вопросы C/C++ 0 20.05.2009 08:30
Безопасное извлечение SunKnight Win Api 1 12.01.2008 02:06