Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по механизму работы 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-объектам в доп.потоке недопустимы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо