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

Вниз

Поток и общие флаги   Найти похожие ветки 

 
i2e   (2011-11-30 15:08) [0]

   // создаем параллельный поток для приема данных
   hThread := CreateThread(nil, 0,
                     @ReadComm,     // адрес процедуры обработки
                           nil, 0,  //
                       ThreadID);   // идентификатор потока

procedure ReadComm; // процедура обработки потока
begin
 while True do begin // бесконечный цикл - прием и подготовка данных
   try
     if not fProcessRun then
     begin ... end;
   except ...
 end
end;


Можно ли без особых защитных ухищрений пользоваться в основной программе флагом fProcessRun (и аналогичными другими общими), менять их, читать?
Программа пользуется общими флагами, но иногда (очень редко) возникает ошибка AV. Может ли быть здесь засада?


 
Slym ©   (2011-11-30 15:15) [1]

i2e   (30.11.11 15:08)
procedure ReadComm;

должно быть function ReadComm(Parameter: Pointer): Integer; stdcall;
иначе
i2e   (30.11.11 15:08)
иногда (очень редко) возникает ошибка AV


 
clickmaker ©   (2011-11-30 15:16) [2]

в многопоточном приложении я бы предпочел пользоваться объектами типа Event или Semaphor.


 
Ega23 ©   (2011-11-30 15:18) [3]


> Можно ли без особых защитных ухищрений пользоваться в основной
> программе флагом fProcessRun (и аналогичными другими общими),
>  менять их, читать?


Можно. Но нужно при этом чётко понимать, что ты делаешь.


> но иногда (очень редко) возникает ошибка AV. Может ли быть
> здесь засада?

http://docwiki.embarcadero.com/VCL/en/SysUtils.EAccessViolation


 
Сергей М. ©   (2011-11-30 15:38) [4]

> Может ли быть здесь засада?

Не может, если fProcessRun - это дельфийский нативный обнобайтный Boolen.
Засада в каких-то других кустах сидит)


 
i2e   (2011-12-01 07:22) [5]

спасибо, коллеги. буду пробовать и разбираться дальше.

к [3]: >> Можно. Но нужно при этом чётко понимать, что ты делаешь.

пытался понять и избежать ситуации, когда в многопоточном приложении  основная программа меняет значение флага (он boolean), а в потоке мы его же как раз проверяем. и вот он, возможный конфликт.


 
sniknik ©   (2011-12-01 07:54) [6]

> и вот он, возможный конфликт.
не там ищешь, конфликт не от показанного флага т.к. не объект, не указатель, и т.д. AV от прямого чтения данных в программе не происходит, он происходит когда вылазишь за пределы программы... в область тебе не разрешенную.

обрати внимание на [1], более вероятно.


 
Leonid Troyanovsky ©   (2011-12-01 08:10) [7]


> i2e   (01.12.11 07:22) [5]

> boolean), а в потоке мы его же как раз проверяем. и вот
> он, возможный конфликт.

Дельфийские потоки уж много лет так работают и ничего.
RTFM: TThread.Terminated.

See also: BeginThread.

--
Regards, LVT.


 
i2e   (2011-12-01 10:26) [8]

> обрати внимание на [1], более вероятно

да, так уже сделал, на тестирование запустил.


 
Юрий_   (2011-12-02 17:40) [9]

Выставлен ли IsMultiThread ?
Флаг, указывающий менеджеру памяти, что требуется потокобезопасность при работе с памятью.
Если использовать родные делфийские механизмы, то этот флаг выставляется автоматически, к CreateThread это не относится


 
i2e   (2012-01-23 13:24) [10]

Помог совет [9].
Сердечно благодарен.


 
RWolf ©   (2012-01-23 13:56) [11]

Правильнее было бы унаследовать TThread, чтобы не городить велосипедов.


 
i2e   (2012-01-24 07:21) [12]

к [11].
было сделано по найденным "в печати" материалам.
возможно, не лучшим способом. просто не настолько хорошо знаю "матчасть". про "унаследовать", если честно - не понял. может поясните.


 
RWolf ©   (2012-01-24 09:32) [13]

я про стандартный способ создания потоков в VCL. TMyThread = class(TThread) и т. д.
см. Demos\Threads, например.


 
Дмитрий Белькевич   (2012-01-24 13:58) [14]


>  про "унаследовать", если честно - не понял. может поясните.


Зачем читать "печать", достаточно побродить по IDE:

Жмёшь: File-New-Other (закладка "New") - Thread object.



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

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

Наверх




Память: 0.5 MB
Время: 0.01 c
2-1327399849
sem
2012-01-24 14:10
2012.05.27
программное изменение регистра символа в RichEdit


6-1255965905
cr@nk
2009-10-19 19:25
2012.05.27
Связь с помощью сокетов в трёхзвенной архитектуре


2-1327310580
i2e
2012-01-23 13:23
2012.05.27
Изменение размеров Image


15-1326913814
PEAKTOP
2012-01-18 23:10
2012.05.27
Самообучающаяся программа


2-1326972707
adigozelov
2012-01-19 15:31
2012.05.27
sms na mobilniy telefon