Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
4-1219219075
ZeBriD
2008-08-20 11:57
2009.10.11
Закрытый ключ шифрования в хранилище Windows XP


2-1249914741
Putnik
2009-08-10 18:32
2009.10.11
Название элемента интерфейса


15-1249632827
yantux
2009-08-07 12:13
2009.10.11
delphi и dll - проблема, рекомендуйте плиз о чём почитать...


15-1250000457
Пит
2009-08-11 18:20
2009.10.11
Проверка логина на PHP + Postgres


2-1249976826
Цукор5
2009-08-11 11:47
2009.10.11
сложности с запросом





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский