Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26066
Рейтинг: 2120
#76: 2007-08-20 15:45:57 ЛС | профиль | цитата
Galkov писал(а):
Пордон, а что, деструктор некого элемента MMTimer остановки не делает

Это не по выходу из приложения, а в процессе работы, при реинициализации мультиков. У меня в приложении это делается при изменении последовательности или количества каналов -- мультики уничтожаются и создаются снова, но таймер продолжал их опрашивать, вот и пришлось его сначала остановить.

[size=-2]------ Добавлено в 15:45
Galkov писал(а):
Увлекательное занятие: заложить гранату, а потом искать от чего она взрывается

Ну от нехватки знаний это все, особенно про работу потоков, пока с ними разберешься.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#77: 2007-08-20 15:54:54 ЛС | профиль | цитата
nesco писал(а):
Это не по выходу из приложения, а в процессе работы, при реинициализации мультиков. У меня в приложении это делается при изменении последовательности или количества каналов -- мультики уничтожаются и создаются снова, но таймер продолжал их опрашивать, вот и пришлось его сначала остановить.

Много слов на НЕОДНОЗНАЧНОМ Великом и Могучем.
И даже при этом изобилии, не ясно вообще, где стоит таймер: внутри или снаружи мультика

Изложить свои мысли в виде ОДНОЗНАЧНО читаемой небольшой схемки - не судьба видать.


BTW: обращение к уничтоженному экземпляру мультика не есть криминал - он возродится в режиме OnlyOnce.

[size=-2]------ Добавлено в 15:54
nesco писал(а):
Ну от нехватки знаний это все, особенно про работу потоков, пока с ними разберешься

Наблюдение: приобрести знание - быстрее и эффективнее.
Но я не настаиваю.
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#78: 2007-08-20 16:10:37 ЛС | профиль | цитата
Galkov, вот приблизительная схема моих мультиканалов code_1849.txt
карма: 22

0
файлы: 1code_1849.txt [1.6KB] [496]
Ответов: 9906
Рейтинг: 351
#79: 2007-08-20 16:27:33 ЛС | профиль | цитата
Приблизительно в этой схеме, вообще вопросов не должно быть
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#80: 2007-08-20 16:39:11 ЛС | профиль | цитата
Galkov, это схема после того, что я написал (про ММТаймер), изначально она такая и была. Но когда я стал менять обычный таймер на ММ, я упустил цикл остановки и затолкал очистку мультиков минуя таймер, вот оно меня и послало... это из серии -- нарвался на гранату
карма: 22

0
Ответов: 9906
Рейтинг: 351
#81: 2007-08-20 17:05:36 ЛС | профиль | цитата
Ты что, вызывал методы ОДНОГО элемента из разных потоков
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#82: 2007-08-20 17:13:04 ЛС | профиль | цитата
Galkov писал(а):
Ты что, вызывал методы ОДНОГО элемента из разных потоков

Если посчитать, что ММТаймер имеет свой собственный поток, то похоже, что ты прав, и никакой синхронизации с действиями таймера не было, и вызов оказался из другого потока.
карма: 22

0
Администрация
Ответов: 15294
Рейтинг: 1518
#83: 2007-08-20 18:49:09 ЛС | профиль | цитата
nesco писал(а):
Если посчитать, что ММТаймер имеет свой собственный поток

считать ничего не надо. В диспетчере задать все видно.

Кстате:
destructor THIMMTimer.Destroy;
begin
FTimer.Enabled := false;
free_and_nil(FTimer);
inherited Destroy;
end;

ты так и не понял для чего и зачем нужен метод free_and_nil несмотря на все старания Galkovа А если еще приплюсовать к тому совершенно лишний вызов FTimer.Enabled := false;, то получаем из 4х строк кода только 2 реально рабочие... 50% лишнего кода однако
карма: 26
0
Ответов: 9906
Рейтинг: 351
#84: 2007-08-20 19:12:50 ЛС | профиль | цитата
на педагогические таланты претензий - НИКАКИХ
карма: 9

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#85: 2007-08-20 19:42:55 ЛС | профиль | цитата
Dilma писал(а):
ты так и не понял для чего и зачем нужен метод free_and_nil несмотря на все старания Galkovа

А г-н Galkov мне ничего, собственно, и не объяснял -- одни только "а зачем?", "а почему?". Насчет
Dilma писал(а):
FTimer.Enabled := false
я уже разобрался, посмотрев KOL, там он уже есть, также как и FTimer.Periodic := true. Насчет Free_and_nil вот что пишет Кладов
Кладов писал(а):
Иногда возникает необходимость "одновременно" разрушить объект и обнулить (присвоить
nil) указателю на этот объект. В VCL для этого существует функция FreeAndNil, в KOL для
этой же цели функция называется Free_And_Nil. Причем, в этой функции сначала
обнуляется переменная-указатель объекта, а уже затем объект разрушается (вызовом
метода Free). Конечно, это почти эквивалентно тому, чтобы объект был сначала разрушен,
а затем присвоен nil переменной-указателю. Но в многопоточном приложении разница
может быть ощутима. Достаточно представить себе ситуацию, в которой объект был
разрушен (или начал разрушаться, но операция еще не завершена), а указатель все еще
не равен nil, и в этот момент потоки переключились, и в другом потоке так же начинают
выполняться какие-то операции с этим же объектом через тот же самый указатель. Даже в
случае однопоточного приложения тот факт, что некоторый глобальный указатель
продолжает показывать на уже несуществующий объект, или на объект, для которого уже
начала выполняться операция разрушения, представляет определенную опасность. Так
что потребность в функции Free_And_Nil очевидна.
Вы можете вразумительно ответить, почему его нельзя использовать, особенно там где применяется поток?

карма: 22

0
Администрация
Ответов: 15294
Рейтинг: 1518
#86: 2007-08-20 23:06:45 ЛС | профиль | цитата
nesco, точно помню, что коллега Galkov, говорил про работу метода, а так же когда и почему его надо использовать. Собственно достаточно взять в руки словарь и перевести английские термины.

nesco писал(а):
Вы можете вразумительно ответить, почему его нельзя использовать, особенно там где применяется поток?

а вот этого как раз никто не говорил. Использовать можно когда хочешь и где хочешь. Только в некоторых случаях(точнее в большинстве) строка Obj := nil; является совершенно бесполезной. Ну и прибавь еще к этому совершенно лишний вызов ф-ции.
карма: 26
0
Ответов: 9906
Рейтинг: 351
#87: 2007-08-21 10:31:02 ЛС | профиль | цитата
Dilma писал(а):
строка Obj := nil; является совершенно бесполезной

и когда это пресловутое Obj является еще и локальной переменной - просто дуреешь
карма: 9

0
Администрация
Ответов: 15294
Рейтинг: 1518
#88: 2007-08-21 11:32:53 ЛС | профиль | цитата
тем более
карма: 26
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#89: 2007-08-21 11:33:44 ЛС | профиль | цитата
tsdima, слушай, а реально вести обмен сообщениями с сревисом? Мне нужно получать и передавать данные. Попробовал UDP для этой цели, сервис передает через сокеты нормально, а вот принимать чего-то не хочет. Когда все было неразделено, то работало. Я тут пока без схем, просто спрашиваю, если действительно остается только UDP, значит буду мучать дальше. Одно неудобство с сервисами, тяжело вести отладку, нет никаких визуальных контролов. Может посоветуешь, как лучше сделать обмен, нужно семь каналов данных?
карма: 22

0
Администрация
Ответов: 15294
Рейтинг: 1518
#90: 2007-08-21 11:39:46 ЛС | профиль | цитата
nesco писал(а):
а вот принимать чего-то не хочет

конечно не хочет. Стандартный прием данных идет с выдачей синхронного события наружу. Синхронизация делается через Windows Messages. Т.е. через оконные сообщения, чего в сервиси работать никогда не будет(поскольку цикла приема передачи сообщений там не сделано). Поэтому ставим ReceiveMode = Manual и самостоятельно получаем данные через вызов doReceive
карма: 26
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)