Вниз
Скачать: CL | DM;

и все таки я ее нашел...   Найти похожие ветки 

← →
delphiForever   (2007-09-14 03:22) [0]

завелась в проге ошибка! выскакивала один раз примерно с 10-15, а то и по 20, 30 выполнений кода нормально работало, нашел, два дня искал, чуть не кончился запускать прогу и вызывать нужную ситуацию с 10-30 раза :), но почему ошибка, даже не ошибка, а вот так происходит? вот немного кода

//первый таймер запускается вместе со стартом программы
procedure TForm1.Timer1Timer(Sender: TObject);
var
 ~~~
begin
Timer1.Enabled:=false;

for i:=0 do n do begin
application.processMessage
//код > if for procedure and other
end;


//второй по OnShow, OnClose - аккуратно завершается
procedure TForm22.Timer1Timer(Sender: TObject);
var
 ~~~
begin
Timer1.Enabled:=false;

while f22Tr do begin
sleep(10);
application.processMessage
//код > if for procedure and other
end;


почему цикл в первом таймере ставал иногда мертво, до завершения выполнения цикла во втором?


← →
Джо ©   (2007-09-14 04:19) [1]

А словами описать эту чехарду с таймерами можно? То есть, что вообще должно происходить в рез-те манипуляций?


← →
Бакук ©   (2007-09-14 05:19) [2]

Почему бы не сделать это в событиях OnCreate, OnShow, OnClose ?


← →
Черный Шаман   (2007-09-14 07:06) [3]


>
> delphiForever   (14.09.07 03:22)


Потому что стандартный таймер синхронизируется на основной VCL поток. Если хочешь явную многопоточность то TThread


← →
Сергей М. ©   (2007-09-14 09:05) [4]


> for i:=0 do n do begin
> application.processMessage


За каким лешим этот код фигурирует в обработчике таймера ?


← →
delphiForever   (2007-09-14 10:07) [5]


> Черный Шаман   (14.09.07 07:06) [3]
>
> >
> > delphiForever   (14.09.07 03:22)
>
>
> Потому что стандартный таймер синхронизируется на основной
> VCL поток. Если хочешь явную многопоточность то TThread

да скорее всего точно так и есть, останавливаю второй и если первый таймер не работает, то начинает работать

но причем тут
> Бакук ©   (14.09.07 05:19) [2]
> Почему бы не сделать это в событиях OnCreate, OnShow, OnClose
> ?

так и не понял )


← →
Сергей М. ©   (2007-09-14 10:09) [6]


> останавливаю второй и если первый таймер не работает, то
> начинает работать


Зачем тебе куча таймеров ?
Достаточно всего одного)


← →
delphiForever   (2007-09-14 10:19) [7]


> Сергей М. ©   (14.09.07 10:09) [6]
> Зачем тебе куча таймеров ?
> Достаточно всего одного)

вот именно куча, примерно больше 10 ),
сам бы  не против одного, но поставленная задача не позволит )


← →
iam   (2007-09-14 10:22) [8]

delphiForever   (14.09.07 10:19) [7]
опиши задачу
ты точно на неправильном пути


← →
ЮЮ ©   (2007-09-14 10:23) [9]

> почему цикл в первом таймере ставал иногда мертво, до завершения
> выполнения цикла во втором?

А что, по твоему, должно было прервать выполнения цикла во втором? Пока тот код не выполнится, другой параллельно в одном потоке выпоняться не может.


← →
Сергей М. ©   (2007-09-14 10:35) [10]


> delphiForever   (14.09.07 10:19) [7]


> больше 10


"Абалдеть !" (с)


> поставленная задача не позволит


Еще как позволит. Просто задачу надо правильно сформулировать.


← →
delphiForever   (2007-09-14 10:37) [11]


> iam   (14.09.07 10:22) [8]
> delphiForever   (14.09.07 10:19) [7]
> опиши задачу
> ты точно на неправильном пути

существует очередь команд к примеру, 0..100 первый таймер бдит и выполняет по потребности команды подготовленные к исполнению, по определеной команде запускается следующую форму где в OnShow запускается второй таймер и бдит несложную анимацию


← →
delphiForever   (2007-09-14 10:38) [12]


> Сергей М. ©   (14.09.07 10:35) [10]
> Еще как позволит. Просто задачу надо правильно сформулировать.

не конечно можно вместо етих 2 таймеров впихнуть один, но стоит ли ето того) подобная ситуация и с остальными )


← →
ЮЮ ©   (2007-09-14 10:41) [13]

> и бдит несложную анимацию

бесконечную?
Тогда хо хотя бы application.processMessage убери из
procedure TForm1.Timer1Timer(Sender: TObject),
а то вместо бдения за командами проскакиваем в бдение за анимацией.


← →
Сергей М. ©   (2007-09-14 10:49) [14]


> конечно можно вместо етих 2 таймеров впихнуть один


Не можно а нужно)


> стоит ли ето того


С учетом твоих сомнений (можно даж сказать - полного непонимания) происходящего оно того стОит. Ты с одним-тотаймером разобраться не можешь, а уж с косым десятком и подавно)

Потому и совет - разберись сначала с одним, а уж потом, если таки приспичит, будешь "пихать" дополнительные.


← →
delphiForever   (2007-09-14 10:52) [15]


> Сергей М. ©   (14.09.07 10:49) [14]
>
> > конечно можно вместо етих 2 таймеров впихнуть один
>
> Не можно а нужно)
> С учетом твоих сомнений (можно даж сказать - полного непонимания)
> происходящего оно того стОит. Ты с одним-тотаймером разобраться
> не можешь, а уж с косым десятком и подавно)
>
> Потому и совет - разберись сначала с одним, а уж потом,
> если таки приспичит, будешь "пихать" дополнительные.


так вот именно по отдельности они работают идеально
> [1]

и ничего общего не используют


← →
Сергей М. ©   (2007-09-14 10:56) [16]


> delphiForever   (14.09.07 10:52) [15]


Вот и научи один-единственный таймер "идеально бдеть" за всеми возложенными на приложение задачами, требующими временные выдержки.


← →
Плохиш ©   (2007-09-14 10:58) [17]


> почему цикл в первом таймере ставал иногда мертво, до завершения
> выполнения цикла во втором?

А почему ион должен был продолжать работу, если при ProcessMessage было получено сообщение от второго таймера и управление, соответственно, передано его обработке. И после его отработки, управление возвращается. Всё работает, так как ты и закодил...

PS. Советую, в конце-то концов, прочитать справку по ProcessMessages внимательно, там подробно описано для чего этот метод используется.


← →
delphiForever   (2007-09-14 10:58) [18]


> Сергей М. ©   (14.09.07 10:56) [16]
>
> > delphiForever   (14.09.07 10:52) [15]
>
>
> Вот и научи один-единственный таймер "идеально бдеть" за
> всеми возложенными на приложение задачами, требующими временные
> выдержки.

а если возникнет ситуация когда выполнение всех задач займет 3-5 сек? ну нельзя тут обойтись одним таймером?


← →
Anatoly Podgoretsky ©   (2007-09-14 11:00) [19]

> delphiForever  (14.09.2007 10:19:07)  [7]

Нет таких задач, есть программисты.


← →
ЮЮ ©   (2007-09-14 11:02) [20]

> так вот именно по отдельности они работают идеально


1) Исключи application.processMessage из обработчиков таймеров, дабы не перескакивать в обработчик другого таймера, не выполнив свой код до конца.

2) Деактивируй остальные таймеры, пока раблтает один. Вот и получишь 1 таймер.

> а если возникнет ситуация когда выполнение всех задач займет
> 3-5 сек? ну нельзя тут обойтись одним таймером?


пока не "выполнится" любая из "задач", другая всё равно выпоняться не сможет. Какой толк от укчи таймеров, если всё равно выполняется обработчик одного из них!


← →
Сергей М. ©   (2007-09-14 11:03) [21]


> delphiForever   (14.09.07 10:58) [18]
>
>


Пойми, что в пределах одного кодового потока обработка событий твоих таймеров, хоть одного хото косого десятка, происходит последовательно !


← →
Anatoly Podgoretsky ©   (2007-09-14 11:05) [22]


> а если возникнет ситуация когда выполнение всех задач займет
> 3-5 сек? ну нельзя тут обойтись одним таймером?

Это твое предположение, обойтись можно и без таймера.


← →
Сергей М. ©   (2007-09-14 11:19) [23]


> delphiForever


Вникай:

const
 TaskCount = .. кол-во тех самых задач ..

var
 TimeCounters: array[0..TaskCount-1] of Integer; //по умолчанию массив yektds[ pyfxtybq
 TimePeriods: array[0..TaskCount-1] of Integer; //здесь должны находиться значения периодов срабатывания тех самых таймеров, которых у тебя была куча, а теперь их заменяет один-единственный

..

//обработчик этого единственного таймера с любым предустановленным тобой периодом срабатывания в диапазоне  <= 50

procedure TSomeObject.TimerEvent(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to TaskCount-1 do begin //для каждого сч-ка времени
   Inc(TimeCounters[i]); //прошло не менее 50 мс
   if TimeCounters[i] = TimePeriods[i] then begin // период ожидания исчерпан ?
     TimeCounters[i] := 0; //сброс счетчика
     DoTask[i]; //выполнение i-й задачи
   end;    
 end;    
end;


← →
Сергей М. ©   (2007-09-14 11:20) [24]


> yektds[ pyfxtybq

= нулевых значений


← →
delphiForever   (2007-09-14 11:21) [25]


> Сергей М. ©   (14.09.07 11:03) [21]
> Пойми, что в пределах одного кодового потока обработка событий
> твоих таймеров, хоть одного хото косого десятка, происходит
> последовательно !


последовательно>хаотически )
ведь работало ж, если точно то не менее 4 раз с пяти и все прекрасно 5,10 минут без единого исключения, но если на "пятый раз" при запуске второго таймера первый ставал, то до его выключения.


← →
Сергей М. ©   (2007-09-14 11:24) [26]


> последовательно>хаотически


А нефих было тыкать App.ProcessMessages где ни попадя, если не понимаешь, что при этом происходит)


← →
Sandman31   (2007-09-14 11:28) [27]

Сергей М. ©   (14.09.07 11:19) [23]

По-моему, этот код не подходит, если DoTask может занимать продолжительное время. Сравнивать надо текущее время с целевыми, а не количество срабатываний таймера-счетчика.


← →
delphiForever   (2007-09-14 11:32) [28]


> Сергей М. ©   (14.09.07 11:24) [26]

> А нефих было тыкать App.ProcessMessages где ни попадя, если
> не понимаешь, что при этом происходит)

без етого вся моя прога рухнет )))))
одним словом уже сделал поток, из него message вместо 5 таймеров, но штук 7 еще осталось )))))


← →
ЮЮ ©   (2007-09-14 11:41) [29]

> без етого вся моя прога рухнет )))))

И чем это хуже того, что "некоторые таймеры намертво виснут"? :)
P.S. А ты попробуй. Если уж с ними не рухнула :)


← →
Сергей М. ©   (2007-09-14 11:43) [30]


> Sandman31   (14.09.07 11:28) [27]


> код не подходит, если DoTask может занимать продолжительное
> время


И этот не подойдет, и другой код не подойдет, и третий, и столохматый)

Какая нафих разница, сколько таймеров при таких вот условиях ? А если нет разницы, зачем их плодить ?

Автору про это уже три десятка постов долдонят, а воз и ныне там)


> сделал поток, из него message вместо 5 таймеров


Ну и нафих он нужен ?

Ты кому message шлешь - окну осн.потока ? Так ведь осн.поток в это время исполняет длительное задание и не обработает твое message, пока задание не будет выполнено.
А если в то самое задание ты затолкаешь Processmessages, ты получишь тот же хаос и бардак, вплоть до исключения EStackOverflow.


← →
delphiForever   (2007-09-14 11:50) [31]


> Сергей М. ©   (14.09.07 11:43) [30]
>
> > Sandman31   (14.09.07 11:28) [27]
> И этот не подойдет, и другой код не подойдет, и третий,
> и столохматый)
>
> Какая нафих разница, сколько таймеров при таких вот условиях
> ? А если нет разницы, зачем их плодить ?
>
> Автору про это уже три десятка постов долдонят, а воз и
> ныне там)
>
>
> > сделал поток, из него message вместо 5 таймеров
>
>
> Ну и нафих он нужен ?
>
> Ты кому message шлешь - окну осн.потока ? Так ведь осн.поток
> в это время исполняет длительное задание и не обработает
> твое message, пока задание не будет выполнено.
> А если в то самое задание ты затолкаешь Processmessages,
>  ты получишь тот же хаос и бардак, вплоть до исключения
> EStackOverflow.

длительное задание ето анимация которая запускается при отображении формы и останавливается после ее закрытия, да так ето длительное задание, но один кадр анимации ето не длительное задание

> [11]


← →
Сергей М. ©   (2007-09-14 11:57) [32]


> ето длительное задание, но один кадр анимации ето не длительное
> задание


Ну а раз не длительное, то и проблем быть не должно.

А чем TAnimation не угодил ? Чем оправдано твое садо-мазо с "ручным" построением и анимированием этой беды ?)


← →
Sandman31   (2007-09-14 12:00) [33]

delphiForever   (14.09.07 11:50) [31]

Не надо анимацию в данном случае. При создании формы в ключевых местах обновляем форму-заставку:

...
SplashForm.Display("Подключение к БД");
...
SplashForm.Display("Настройка параметров");
...

а внутри метода Display отображаем сообщение из параметра и вызываем Self.Update;


← →
delphiForever   (2007-09-14 12:04) [34]


> Сергей М. ©   (14.09.07 11:57) [32]

> А чем TAnimation не угодил ? Чем оправдано твое садо-мазо
> с "ручным" построением и анимированием этой беды ?)

организм принимает только код написанный своими руками ) ненавижу использовать чужие, готовые компоненты, там всегда что-то не так как нужно )


← →
Anatoly Podgoretsky ©   (2007-09-14 12:09) [35]

> delphiForever  (14.09.2007 12:04:34)  [34]

Ой и ты уже написал свою Дельфи.
Силен однако.


← →
Сергей М. ©   (2007-09-14 12:09) [36]

Меж прочим, TAnimate как раз и придуман для батонокидателей, дабы те не заморачивались всякими там сообщениями, зависаниями, таймерами и прочей абракадаброй)

Бросил его на форму, указал avi-файл, активировал - и вуаля !)
Дальше можно занимать свое приложение чем угодно и сколь угодно долго, анимация при этом крутится "сама по себе")


← →
Сергей М. ©   (2007-09-14 12:11) [37]


> delphiForever   (14.09.07 12:04) [34]


Твое словоблудие при этом не оправдывает использование тобой компонент TApplication)


← →
sniknik ©   (2007-09-14 12:14) [38]

> там всегда что-то не так как нужно )
естественно! ведь правильные решения ты, суда по этому топику, просто органически не воспринимаешь... ;)


← →
delphiForever   (2007-09-14 12:20) [39]


> Сергей М. ©   (14.09.07 12:09) [36]
> Меж прочим, TAnimate как раз и придуман для батонокидателей,
>  дабы те не заморачивались всякими там сообщениями, зависаниями,
>  таймерами и прочей абракадаброй)
>
> Бросил его на форму, указал avi-файл, активировал - и вуаля
> !)
> Дальше можно занимать свое приложение чем угодно и сколь
> угодно долго, анимация при этом крутится "сама по себе")

В свое время физики предложили свою подборку методов решения задачи о поимке льва в пустыне и помещении его в клетку. А как решают ту же задачу различные деятели эпохи информационных технологий?
Программист на Си
Ищет в пустыне камень и помещает его в клетку. Присваивает камню значение "лев".
Продвинутый программист на Си
Присвавает пустыне значение "клетка".
Программист на Дельфи
Пишет во все конференции: "Народ, где взять компонент, который ищет в пустыне льва и помещает его в клетку?" - а развитие?


> Сергей М. ©   (14.09.07 12:11) [37]
> Твое словоблудие при этом не оправдывает использование тобой
> компонент TApplication)

ну от етого я никак еще не могу отказаться )


← →
ЮЮ ©   (2007-09-14 12:24) [40]

> - а развитие?

десяток TTimer-ов нв форме долны были заставить остановиться и задуматься. Ну и где оно - развитие?



Страницы: 1 2 вся ветка

Скачать: CL | DM;



Память: 0.56 MB
Время: 0.017 c
3-1181115486
Strang
2007-06-06 11:38
2007.10.14
Размерность полей


2-1190398999
Gloomer
2007-09-21 22:23
2007.10.14
Свойства модема для конкретного соединения удаленного доступа


6-1171471733
alexm_hs
2007-02-14 19:48
2007.10.14
Отправка RARP-пакета (Send RARP).


2-1184309419
zero
2007-07-13 10:50
2007.10.14
Не срабатывает метод insert в Query


2-1189849336
Sonic90
2007-09-15 13:42
2007.10.14
TrackBar




   Наверх