Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поток и общие флаги [D7, XP]


i2e ©   (2011-11-30 15:08:00) 

   // создаем параллельный поток для приема данных
   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. Может ли быть здесь засада?


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


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


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

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


RWolf   (2012-01-24 09:32:00) [2]

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


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

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


RWolf   (2012-01-23 13:56:00) [4]

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


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

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


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

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


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

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

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


Leonid Troyanovsky   (2011-12-01 08:10:00) [8]


> i2e   (01.12.11 07:22) [5]

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

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

See also: BeginThread.

--
Regards, LVT.


sniknik   (2011-12-01 07:54:00) [9]

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

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


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

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

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

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


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

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

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


Ega23   (2011-11-30 15:18:00) [12]


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


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


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

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


clickmaker   (2011-11-30 15:16:00) [13]

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


Slym   (2011-11-30 15:15:00) [14]

i2e   (30.11.11 15:08)
procedure ReadComm;

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо