![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по механизму работы application.ProcessMessages
leonidus © (2009-08-06 17:16:00)Есть поток из которого вызывается процедура основного потока (назовем ее Spelling). Процедура ресурсоемкая поэтому периодически в ней вызывается application.ProcessMessages.
Пример кода:
...
Spelling(word1, word2, result1, result2);
if result1='' then
так вот заметил странность. Если в Spelling закомментировать application.ProcessMessages то все нормально, однако если application.ProcessMessages раскомментировать, то не дожидаясь полного выполнение процедуры Spelling, программа сразу переходит на строчку проверки условия if result1='' then. Это так и должно быть или меня глючит?
leonidus (2009-08-07 09:09:00) [1]Спасибо, вопрос решен.
Leonid Troyanovsky (2009-08-06 23:09:00) [2]
> Loginov Dmitry © (06.08.09 22:17) [12]
> Sleep(0); // Для избежания 100%-й загрузки процессора
Не избежит.
Бо, если не объявился более приоритетный поток, то
выполняющийся процессором поток будет и дальше выполняться.
А для избежания надо, к примеру, MsgWaitForMultipleObjects
где-то в районе Application.OnIdle, хотя, IMHO, лучше ожидать
в отдельной форме (окне).
--
Regards, LVT.
Loginov Dmitry (2009-08-06 22:17:00) [3]> Есть поток из которого вызывается процедура основного потока
> (назовем ее Spelling). Процедура ресурсоемкая поэтому периодически
> в ней вызывается application.ProcessMessages.
Автор, определись, либо все делай в основном потоке, и
периодически вызывай application.ProcessMessages для избежания
зависаний интерфейса пользователя, либо вызывай процедуру из
дополнительного потока, но в ней - никаких
application.ProcessMessages
> Как же с одной стороны не затормозить главный поток и в
> тоже время дождаться полного завершения Spelling ?
Решение 1: бросить на форму таймер, и через каждую
секунду проверять, не завершился ли поток.
Решение 2:
в главном потоке
while <поток не завершился> do
begin
Sleep(0); // Для избежания 100%-й загрузки процессора
Application.ProcessMessages;
end;
Сергей М. (2009-08-06 21:26:00) [4]
> leonidus
Проблема в том, что ты не понимаешь какой поток и чем у тебя занят в каждый конкретный момент времени, начиная со времени старта процесса твоего приложения.
Сергей М. (2009-08-06 20:44:00) [5]
> Spelling это процедура основного потока application
Не надо гнать пургу.
Spelling - это просто процедура.
Сергей М. (2009-08-06 20:23:00) [6]Дуй уже в "Начинающие" - там будет полегче.
Сергей М. (2009-08-06 20:22:00) [7]
> процедура основного потока application
Галиматьища несусветная.
Игорь Шевченко (2009-08-06 20:20:00) [8]
> Ты не внимательно читал
Война давно кончилась, хватит партизанить
> Есть поток из которого вызывается процедура основного потока
> (назовем ее Spelling)
Тема вызова не раскрыта, мало кода, а телепаты в отпуске - лето.
leonidus (2009-08-06 20:14:00) [9]Ты не внимательно читал, Spelling это процедура основного потока application, я что не могу к ней обратиться из другого потока? В принципе я уже пробовал ее перенести внутрь моего потока, таже самая ситуация. Как же с одной стороны не затормозить главный поток и в тоже время дождаться полного завершения Spelling ?
Сергей М. (2009-08-06 19:36:00) [10]
> моя процедура занимается только расчетом
Вот и пусть им занимается.
И не лазит при этом в "чужие расчеты"
Сергей М. (2009-08-06 19:23:00) [11]
> Synchronize в природе имеется.
И что ?
Мало ли что "в природе имеется"..
Ты же не природа, а хрен знает что нахреначивший в своем коде)
Сергей М. (2009-08-06 19:20:00) [12]
> кто вам сказал что я обращаюсь к VCL
Ты сам и сказал
> поток из которого вызывается ... application.ProcessMessages.
leonidus (2009-08-06 19:06:00) [13]Во-первых кто вам сказал что я обращаюсь к VCL, моя процедура занимается только расчетом, да и Synchronize в природе имеется.
Сергей М. (2009-08-06 17:25:00) [14]
> так и должно быть
Могло быть еще хуже)
Обращения к VCL-объектам в доп.потоке недопустимы.