Alex2013 писал(а): application.ProcessMessages;
Если нежелательно чтобы процесс заставлял работать процик на 100%, либо его нужно приоритет
Код: Выделить всё
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,tpTimeCritical);
thread.Priority=tpIdle;
либо в местах где можно подождать желательно сделать Sleep(ms);
Добавлено спустя 3 минуты 32 секунды:Alex2013 писал(а):Кстати, как я уже писал в программах для виднды потоки можно использовать не применяя класс TThread...
обращаясь к ядру системы через WinApi
На самом деле TThread использует ту же WinApi
Только он уже TObject и умеет Synchronize - что для окошечного приложения очень важно..
Добавлено спустя 5 минут 50 секунд:Alex2013 писал(а):Там есть свои подводные камни но местами код получается даже проще чем с TThread .
ничем не проще, за исключением что не тянут лишние мьютексы и envents-ы, которые помогают синхронизировать с главным процеесом и правильно ожидать завершение TThread..
Иначе придется все это ручками прописывать..
Процесс не только нужно запусить но его нужно еще уметь останавливать.. и завершать. Иначе ошибки будут сыпаться потоком..
Добавлено спустя 16 минут 37 секунд:Alex2013 писал(а):юбой вызов application.ProcessMessages; из MyThread.Execute; гарантированно мгновенно вызывает КРАХ программы, а иногда и крах системы с "экраном синей смерти" !
При запуске программы ядро выделяет поток.. Любая программа, даже консольная "хелло ворлд" - это есть изолированный поток..
В оконной программе тоже есть главный единственный поток. он находится в цикле и обрабатывает поступления Message.. Отсюда окошко программы реагирует на перетаскивания, изменения размеров. На кнопку закрытия все это идет через WinProc..
Когда вы в программе напишите
Код: Выделить всё
for i:=0 to 100000000 do
begin
sleep(1);
end
и оно будет выполнятся долго. При этом окошко подвиснет.. потому что главный процесс занят этим циклом.
чтобы окошко как то реагировала на добавим принудительную оброботку WinProc на поступившие Message
Код: Выделить всё
for i:=0 to 100000000 do
begin
sleep(1);
application.ProcessMessages;
end
окошко шевелится..
но когда application.ProcessMessages; вызывается другим процессом - равносильно когда разные диспечера запустили разные поезда в однокалейку.. в одна и та же переменная может иметь разные значения в одно время..
Все это называется конкуренция за ресурс разными процессами..