Форум: "Прочее";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Внизи все таки я ее нашел... Найти похожие ветки
← →
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 вся ветка
Форум: "Прочее";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.028 c