![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток и общие флаги [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