![]() |
|
|
![]()
|
|
| Valeri |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.2.2007 Репутация: нет Всего: нет |
Так ведь Synchronize нужна, чтобы предотвратить одновременный доступ к одному и тому же объекту. В моей программе только поток чтения обращается к объектам
Form1->Nsect=Form1->Data.RecByte1 Form1->Fh=(Form1->Data.RecByte2)+((Form1->Data.RecByte3)*255); Form1->Label20->Caption=IntToStr(Form1->Data.RecByte1); Form1->Label21->Caption=IntToStr(Form1->Data.RecByte2); Form1->Label23->Caption=IntToStr(Form1->Data.RecByte3); Form1->Label24->Caption=IntToStr(Form1->Fh); , а чтобы не случилось проблем я и пытаюсь притормаживать поток чтения. |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Synchronize нужна всегда, когда обраащешься к визуальным компонентам (Form, Label и т.д.) потому что есть ещё основной поток твоей программы, и когда он там к чему обратится неизвестно (событий же куча). Поэтому надо синхронизировать. Попрбуй сделать как я написал, может висяки исчезнут.
Да и здесь на форуме есть несколько тем, где это более-менее описано. А к данной теме синхронизация очень отдалённо относится -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Valeri |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.2.2007 Репутация: нет Всего: нет |
Сделал синхронизацию всех обращений к компонентам VCL из потока, но никакого эффекта - пока в порт не поступают данные программа также виснет при попытке передавать данные в порт.
Согласен СИнхронизацию не обсуждаем, речь о работе с потоками. Фишка еще вот в чем - когда убираю функции Suspend и Resume, то все работает нормально - и чтение идет и запись, но как-то это не красиво: при записи в порт надо остановить чтение. Пока не придумал как. |
|||
|
||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Если Вы используете FreeOnTerminate = true, то после Resume() вообще обращаться к как либо к объекту TThread обращаться опасно. К тому времени, когда Вы попытаесь обратиться, вполне возможно, что он уже завершился и в о
Вольный перевод
Что касается использования WaiteFor, то все очень просто. WaitFor как раз должен следовать за Resume, но не следующей сточкой
То есть в отличие от вашего кода мы имеем участок, когда идет паралельное выполнение в основном и дочернем потоке. А WaiteFor() в данном случае приминяется для синхронизации этих потоков. Мы же не знаем, кто завершит свой код раньше основной поток или дочерний. Но такое поведене справедливо при FreeOnTerminate= false -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| pandrew |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 27.3.2006 Репутация: 3 Всего: 3 |
Читаем: TThread::Terminate Signals the thread to terminate by setting the Terminated property Так что утверждение про разрушение td между вызовами сомнительно. Я всегда пишу потоки как бесконечную петлю обработки (иначе не понимаю зачем они нужны), поэтому самозавершения потоков у меня не бывает. Бывают правда исключение в потоковой функции, которые приводят к завершению, если не обрабатываются. Но я всегда рулю всеми потоками из главного без проблем по указанному варианту. В вашей логике те же грабли: любой вызов td может быть некорректен, ибо td уже разрушен |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Причем тут это? Вы вводную читали?
Поток успевает завершиться сам, а не принудительно через Terminate. И таких задач, где нет бесконечного цикла навалом. Если Вы не встречали в своей практике, это еще не значит, что их нет. Так что Ваш код для данного случаЯ ошибочен. Поток во-первых может завершиться сам до вызова Terminate. Ну а если Вы этот же код используете у себя и при этом у вас есть цикл с проверкой Terminated и FreeOnTerminate == true, то код
опасен все равно. Потому что есть вероятность, что Вы можете схлопотать эксепшен на вызове WaitFor(). Надеяться на то, что между вызовами Terminate и WaitFor объект не успеет разрушится, неразумно. Если уж очень хочется обнулить td то логичнее и безопаснее смотрелось бы
-------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
У меня основной целью было не обнулить td, а чтобы не росла занимаемая программой память из-за постоянно создаваемых потоков.
В принципе я уже переделал основные потоки, к-рые создаются моей программой, по типу бесконечной петли обработки, но есть ещё поток, который создаётся время от времени. О, прямо сейчас придумал! А если и этот поток делать как бесконечную петлю обработки, но, поскольку он должен выполняться эпизодически, ввести дополнительное условие:
А флаг просто менять из того потока, который должен активировать этот -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
тебе не надо ничего придумывать. вместо этого лучше прочитай пару-тройку статей про потоки и синхронизацию. твой поток можно сделать, например, так:
когда нужно, чтобы рабочий поток выполнил "...", в основном потоке делаешь:
|
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Да, суть та же, только писанины больше. Всё равно же, все эти апишные функции (как впрочем и все), по сути - обёртки для обычных mov eax, ecx
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |