Форум: "Начинающим";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];
ВнизВопрос по механизму работы 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.048 c