Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1327043868
Chuck Bass
2012-01-20 11:17
2012.05.27
Указать позицию для записи таблицы БД


2-1327265150
Чайник
2012-01-23 00:45
2012.05.27
Можно ли добавить в стандартный диалог..


4-1257275310
mihail
2009-11-03 22:08
2012.05.27
Как на прямую обращаться к байтам файлового носителя?


2-1327074466
jacksotnik
2012-01-20 19:47
2012.05.27
Ширина колонки


15-1327330014
upc
2012-01-23 18:46
2012.05.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский