![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
mr_smit |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: нет Всего: 4 |
По событию таймера, раз в 5 сек, происходит запись данных в СОМ порт, что подвешивает программу. Как запустить процедуру таймера в отдельном потоке?
|
|||
|
||||
samsamich |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
Надо не процедуру таймера запускать в отдельном потоке, а создавать отдельный поток в процедуре таймера..
|
|||
|
||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
|
|||
|
||||
mr_smit |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: нет Всего: 4 |
Во во... Может конечно глупо, но попробовал так:
Ругается на классы... типа не может один класс быть внутри другого. Т.к. у меня есть процедура ReadSensors "внутри таймера".
Можно конечно убрать привязку к TForm1, но тогда "поплывет" весь код... Не работал с потоками раньше. Неужели нельзя создать поток и выполнять процедуру в нем??? |
||||||
|
|||||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Если нет опыта работы с потоками, то обязательно к прочтению http://forum.vingrad.ru/forum/topic-60076.html
Мне еще MSDN помог в освоении потоков. Так просто с наскоку маловероятно, что получится что-то работающее. |
|||
|
||||
mr_smit |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: нет Всего: 4 |
Спасибо, почитаю. Тем не менее вопрос в силе:
Добавлено через 1 минуту и 23 секунды В двух словах, по простому, с примером, может кто объяснит, пожалуйста. |
|||
|
||||
samsamich |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
|
||||||
|
|||||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
ИМХО, таймер тут вообще не нужен.
Создай поток, выполняй в нём запись в порт. После записи засыпай поток на время, оставшееся до следующего момента срабатывания. Например: 0 секунда - пишем данные, это заняло, например, 0.5 секунд 0.5 секунд - интервал 5 секунд, прошлое срабатывание в 0 секунд, сейчас 0.5 секунд. Значит засыпаем на 4.5 секунды - Sleep(4500). 5 секунд - пишем данные...... |
|||
|
||||
Matematik |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 17 Всего: 50 |
+1 Примерно так
|
||||
|
|||||
mr_smit |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: нет Всего: 4 |
Создал отдельный unit2 для потока:
А в unit1 написал:
Получаю ошибку при создании потока. BMP, PColor и т.д. сделал глобальными в unit1 Добавлено через 2 минуты и 16 секунд EAccessViolation |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Это говорит лишь о том, что ошибка работы с памятью. Наверняка не синхронизировал доступ к глобальному объекту из разных потоков. Еще варианты дважды удалил или не создал, а пользуешься. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
А может так создавать объект?
|
|||
|
||||
mr_smit |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 254 Регистрация: 27.2.2008 Где: Самара Репутация: нет Всего: 4 |
Я код привел, какая там может быть синхронизация??? Одна процедура Execute. Переменные объявлены в unit1. Ошибка возникает каждый раз при создании. Если бы дело было в синхронизации, то ошибка не всегда бы возникала. Добавлено через 1 минуту и 13 секунд
Не думаю что это поможет. Просто не пойму что тут может быть не правильно, 10 строк кода. |
||||||
|
|||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Например обращаешься к BMP из 2х потоков одновременно. Вообще, посмотри точку вылета в Call Stack. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Gwire |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: 1 Всего: 4 |
Потоковый таймер с использованием CreateWaitableTimer;
FWaitEvent это объект Event-подобный, стой разницей что он устанавливается сам со строго заданным интервалом. Если процедура Run выполняется дольше установленного времени, то при возврате в Execute FWaitEvent уже будет установлен и следуюций цикл выполнится не замедлительно. Чтобы дождаться следующего сраватывания таймера перед выходом из Run вставить "ResetEvent( FWaitEvent );" Если нужно подождать заданое время, то нужно вместо ResetEvent переустоновить интервал - Interval:= FInterval; Удачи. PS: Dom прав - создавать нужно "от имени" класса а не объекта. То что ты объявишь переменную (указатель на объект), var LCDThead: TLCD, она не станет объектом, это только определит её поведение для компилятора. А любой вызов метода не существуещего объекта даст "EAccessViolation" в том числе и Create Сперва необходимо поместить в переменную значение: LCDThead := TLCD.Create(false). Здесь Create метод класса а не объекта. Тоже самое и в при обащении в свойству объекта BMP.Canvas. Нет BMP:= TBitmap.Create; Это сообщение отредактировал(а) Gwire - 29.3.2010, 15:10 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |