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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2011, 01:34   #1
vladimir0108
 
Регистрация: 08.01.2009
Сообщений: 7
По умолчанию Потоки и CriticalSection

Написал свой класс. Есть процедура прорисовки RedrawItem.

TMyList = class(TCustomControl)
public
RedrawItem(...);
...
procedure RedrawItem(...);
begin
CriticalSection.Enter;
...
CriticalSection.Leave;
end;

Прорисовка происходит по нажатию мышой и в отдельном потоке. Так вот, если одновременно происходит прорисовка в потоке и происходит нажатие мышой, то появляется ошибка. Вопрос - почему? Ведь прорисока находится в критической секции
vladimir0108 вне форума Ответить с цитированием
Старый 18.07.2011, 02:39   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

у нажатия мышки и у потока разные обработчики. И слекдовательно в потоке юзается крит. секция а в нажатии мышкой - нет.

И где инициализация и финализация крит.секции?

Не проще ли сделать перерисовку в отдельном методе с исп. крит секций. А затем этот метод использовать и в нажатии мышкой и в потоке.
Человек_Борща вне форума Ответить с цитированием
Старый 18.07.2011, 04:50   #3
vladimir0108
 
Регистрация: 08.01.2009
Сообщений: 7
По умолчанию

Инициализация и финализация крит.секций в конструкторе и деструкторе класса соответственно.

Что значит в отдельном методе?
vladimir0108 вне форума Ответить с цитированием
Старый 18.07.2011, 09:59   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

ок:
Код:
var
  CS:TCriticalSection; 

implementatation

{Общий метод класса....}
procedure TmySomeClass.SimpleGeneralMethod; 
begin
CS.Enter;
..
CS>Leave;
end;

{Модуль потока}

procedure TThreadObj.OnExecute;
begin
mySomeClass.SimpleGeneralMethod;
end;

{Модуль форм}

procedure TForm.ButtonClick(Sender: TObject);
begin
mySomeClass.SimpleGeneralMethod;
end;
Смысл ясен?
Человек_Борща вне форума Ответить с цитированием
Старый 18.07.2011, 12:57   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> TCustomControl

работа с любым VCL контролом должна происходить только в главном потоке.
Отсюда выводы:

1) Критическая секция до лампочки
2) про Synchronize() не забываем
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
потоки Cpluser Общие вопросы .NET 5 15.02.2011 22:17
потоки Cpluser C# (си шарп) 0 14.02.2011 21:24
Потоки StudeHt Помощь студентам 1 06.05.2010 16:26
CriticalSection -> зависание программы PUH Помощь студентам 1 05.11.2009 13:19