Форум: "Начинающим";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];
ВнизПоток и общие флаги Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c