Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.014 c
4-1127649408
Jolik
2005-09-25 15:56
2005.11.27
PAS обертка для ICMP.DLL


1-1130791479
Aragon
2005-10-31 23:44
2005.11.27
Передача по ссылке параметра в Dll-процедуру


2-1131810989
The Sound
2005-11-12 18:56
2005.11.27
Кирилица в имени файла.


1-1130935096
JohnKorsh
2005-11-02 15:38
2005.11.27
Размеры формы на экране с меньшим разрешением.


9-1120952011
Тестер1
2005-07-10 03:33
2005.11.27
Кто нибудь пытался выдрать анимацию из игры Братья Пилоты ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский