Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

TThread   Найти похожие ветки 

 
axx   (2005-11-07 10:35) [0]

Здравствуйте. Подскажите пожалуйста новечку ...

 ThDailModul = class(TThread)
 private
  FOnState: TNotifyEvent;
 published
  property OnState:TNotifyEvent read FOnState write FOnState;

... не является ли использование события без синхронизации от TThread в основном потоке приложения потенциальным косяком ?


 
Digitman ©   (2005-11-07 10:40) [1]

это зависит от того что происходит в теле конкретного вызываемого метода-обработчика события


 
axx   (2005-11-07 10:46) [2]

В обработчик события просто передается State:SmallInt и запоминается основным потоком.
TDialNotifyEvent = procedure(State:Smallint) of object;


 
Digitman ©   (2005-11-07 10:55) [3]


> запоминается основным потоком


это как ?

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

TMyThread = class(TThread)
..
 FDialNotifyEvent: TDialNotifyEvent;
..
end;

procedure TMyThread.Execute;
begin
..
 FDialNotifyEvent(5);
..
end;

..

var
 AState: Smallint;
procedure TSomeObject.DialNotifyEvent(State:Smallint);
begin
 AState := State; //это "запоминание" выполняется в потоке MyThread.ThreadId, а не в основном потоке !

//и в момент этого самого "запоминания" основной поток вполне может обращаться к переменной AState по записи или чтению, ничего не зная о том что переменная AState в этот же момент модифицируется другим потоком
end;


 
axx   (2005-11-07 11:04) [4]

Спосибо за разъяснения .
Я так понимаю что в моем трудном :-) случае поможет

TCriticalSection.Acquire
...
FDialNotifyEvent(5);
...
TCriticalSection.Release

Только не пинайте если опять глупость сказал :-)))


 
Digitman ©   (2005-11-07 11:08) [5]

поможет, если любой другой поток, потенциально обращающийся к AState, будет обращаться к этой переменной с использованием той же крит.секции


 
Leonid Troyanovsky ©   (2005-11-07 13:18) [6]


> axx   (07.11.05 11:04) [4]

> Я так понимаю что в моем трудном :-) случае поможет
> TCriticalSection.Acquire


Думаю, что InterlockedExchange для присвоения достаточно.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
4-1127551255
Antoha
2005-09-24 12:40
2005.11.27
Как сервисному приложению отловить вход пользователя в систему.


3-1129119063
ch_victor
2005-10-12 16:11
2005.11.27
TDataSetProvider + Win98


3-1129369145
AlexLines
2005-10-15 13:39
2005.11.27
Поиск в БД


3-1129522217
Vista
2005-10-17 08:10
2005.11.27
Люди добрые помогите....


6-1124017123
Admeral
2005-08-14 14:58
2005.11.27
Char ?