Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.11;
Скачать: CL | DM;

Вниз

Вопрос по механизму работы application.ProcessMessages   Найти похожие ветки 

 
leonidus   (2009-08-06 17:16) [0]

Есть поток из которого вызывается процедура основного потока (назовем ее Spelling). Процедура ресурсоемкая поэтому периодически в ней вызывается application.ProcessMessages.

Пример кода:

...
Spelling(word1, word2, result1, result2);
if result1="" then

так вот заметил странность. Если в Spelling закомментировать application.ProcessMessages то все нормально, однако если application.ProcessMessages раскомментировать, то не дожидаясь полного выполнение процедуры Spelling, программа сразу переходит на строчку проверки условия if result1="" then. Это так и должно быть или меня глючит?


 
Сергей М. ©   (2009-08-06 17:25) [1]


> так и должно быть


Могло быть еще хуже)

Обращения к VCL-объектам в доп.потоке недопустимы.


 
leonidus   (2009-08-06 19:06) [2]

Во-первых кто вам сказал что я обращаюсь к VCL, моя процедура занимается только расчетом, да и Synchronize в природе имеется.


 
Сергей М. ©   (2009-08-06 19:20) [3]


> кто вам сказал что я обращаюсь к VCL


Ты сам и сказал


> поток из которого вызывается ... application.ProcessMessages.


 
Сергей М. ©   (2009-08-06 19:23) [4]


> Synchronize в природе имеется.

И что ?
Мало ли что "в природе имеется"..
Ты же не природа, а хрен знает что нахреначивший в своем коде)


 
Сергей М. ©   (2009-08-06 19:36) [5]


> моя процедура занимается только расчетом


Вот и пусть им занимается.
И не лазит при этом в "чужие расчеты"


 
leonidus   (2009-08-06 20:14) [6]

Ты не внимательно читал, Spelling это процедура основного потока application, я что не могу к ней обратиться из другого потока? В принципе я уже пробовал ее перенести внутрь моего потока, таже самая ситуация. Как же с одной стороны не затормозить главный поток и в тоже время дождаться полного завершения Spelling ?


 
Игорь Шевченко ©   (2009-08-06 20:20) [7]


> Ты не внимательно читал


Война давно кончилась, хватит партизанить


> Есть поток из которого вызывается процедура основного потока
> (назовем ее Spelling)


Тема вызова не раскрыта, мало кода, а телепаты в отпуске - лето.


 
Сергей М. ©   (2009-08-06 20:22) [8]


> процедура основного потока application


Галиматьища несусветная.


 
Сергей М. ©   (2009-08-06 20:23) [9]

Дуй уже в "Начинающие" - там будет полегче.


 
Сергей М. ©   (2009-08-06 20:44) [10]


> Spelling это процедура основного потока application


Не надо гнать пургу.
Spelling - это просто процедура.


 
Сергей М. ©   (2009-08-06 21:26) [11]


> leonidus


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


 
Loginov Dmitry ©   (2009-08-06 22:17) [12]

> Есть поток из которого вызывается процедура основного потока
> (назовем ее Spelling). Процедура ресурсоемкая поэтому периодически
> в ней вызывается application.ProcessMessages.


Автор, определись, либо все делай в основном потоке, и
периодически вызывай application.ProcessMessages для избежания
зависаний интерфейса пользователя, либо вызывай процедуру из
дополнительного потока, но в ней - никаких
application.ProcessMessages


> Как же с одной стороны не затормозить главный поток и в
> тоже время дождаться полного завершения Spelling ?


Решение 1: бросить на форму таймер, и через каждую
секунду проверять, не завершился ли поток.

Решение 2:
в главном потоке
while <поток не завершился> do
begin
 Sleep(0); // Для избежания 100%-й загрузки процессора
 Application.ProcessMessages;
end;


 
Leonid Troyanovsky ©   (2009-08-06 23:09) [13]


> Loginov Dmitry ©   (06.08.09 22:17) [12]

>  Sleep(0); // Для избежания 100%-й загрузки процессора

Не избежит.
Бо, если не объявился более приоритетный поток, то
выполняющийся процессором поток будет и дальше выполняться.

А для избежания надо, к примеру, MsgWaitForMultipleObjects
где-то в районе Application.OnIdle, хотя, IMHO, лучше ожидать
в отдельной форме (окне).

--
Regards, LVT.


 
leonidus   (2009-08-07 09:09) [14]

Спасибо, вопрос решен.



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

Текущий архив: 2009.10.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1249710891
Alexey
2009-08-08 09:54
2009.10.11
Delphi 7 и Windows 7


8-1198056476
Klim
2007-12-19 12:27
2009.10.11
Image+Rect


15-1249556339
desc
2009-08-06 14:58
2009.10.11
Несовсем понятно чем отличается...


4-1211897790
Dmitry S
2008-05-27 18:16
2009.10.11
Как сделать чтобы окно было видно всегда?


4-1219140902
polezhayev
2008-08-19 14:15
2009.10.11
Управление другим приложением