Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
3-1181047173
Альф
2007-06-05 16:39
2007.10.14
Прерывание выполнения SELECT


2-1190130186
Евгений Р.
2007-09-18 19:43
2007.10.14
Заштриховать область


15-1189579588
DVM
2007-09-12 10:46
2007.10.14
Подскажите программу для PINGA


15-1189669246
Vlad Oshin
2007-09-13 11:40
2007.10.14
Идея написать программку - статистика футбола, например


2-1190117780
Fligian
2007-09-18 16:16
2007.10.14
Добавление TImage на TMemo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский