Сейчас на форуме: tyns777 (+4 невидимых) |
eXeL@B —› Программирование —› Пауза в Delphi |
Посл.ответ | Сообщение |
|
Создано: 29 сентября 2010 00:47 · Поправил: Isaev · Личное сообщение · #1 Невероятно странный вопрос, но всё же: Каким образом организовать в Delphi паузу, чтобы при ожидании не грузила дико процесс и обрабатывались события (особенно на закрытие программы!)? В сети куча советов, которые на деле не пашут. Code:
Вот это полная противоположность тому, что надо! ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 29 сентября 2010 01:03 · Личное сообщение · #2 Юзай в цикле procedure ProcessMessages; var Msg: TMsg; function ProcessMsg(var Msg: TMsg): Boolean; begin Result := False; if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin Result := True; if Msg.Message <> WM_QUIT then begin TranslateMessage(Msg); DispatchMessage(Msg); end else DispatchMessage(Msg); end; end; begin while ProcessMsg(Msg) do; end; |
|
Создано: 29 сентября 2010 01:12 · Личное сообщение · #3 |
|
Создано: 29 сентября 2010 01:29 · Личное сообщение · #4 |
|
Создано: 29 сентября 2010 01:57 · Личное сообщение · #5 Code:
Попробуй так. На Delphi 7 пашет. ----- The truth is out of there... |
|
Создано: 29 сентября 2010 02:02 · Поправил: Isaev · Личное сообщение · #6 Lumen Зашибись! [added] Рано обрадовался ещё раз суть проблемы... на простейшем примере Code:
Вот хотелось бы, чтобы в процессе выполнения цикла: 1. можно было закрыть форму 2. процессор не грузился Error13Tracer пишет: Само собой, что прога виснуть будет. А с чего она должна виснуть? она должна отдыхать... Как таймер работает не грузя систему? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 29 сентября 2010 02:49 · Поправил: Lumen · Личное сообщение · #7 Sleep(1) к примеру можно добавить. Тогда виснуть по идее не должно. А чтобы можно было закрыть форму - добавить проверку на Application.Terminated. Code:
----- The truth is out of there... |
|
Создано: 29 сентября 2010 02:58 · Поправил: Isaev · Личное сообщение · #8 |
|
Создано: 29 сентября 2010 03:32 · Поправил: Isaev · Личное сообщение · #9 Что-то на основе WaitableTimer хотелось бы сделать, но никак до конца не разберусь... Code:
что тут не так? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 29 сентября 2010 04:09 · Личное сообщение · #10 |
|
Создано: 29 сентября 2010 04:12 · Личное сообщение · #11 |
|
Создано: 29 сентября 2010 06:53 · Личное сообщение · #12 Code:
1) P должен быть указателем на Int64; 2) lPeriod = 0, таймер сигнализирует однажды. ----- IZ.RU |
|
Создано: 29 сентября 2010 08:44 · Личное сообщение · #13 Application.ProcessMessages был создан программистами борланда как временное решление проблемы мультипоточности в Delphi а потом оставлен для совместимости. Если вы его используете, значит код написан в корне неправильно. В GUI приложении на Delphi паузы не может быть в принципе, т.к. в основной нити идет выборка и обработка оконнных сообщений, останавливать которую нельзя. Для таких дел есть класс TThread, создающий отдельную нить. В примере с заполнением цикла можно сделать так: Code:
Абсолютно не грузит систему, стоит задержка, т.к. отдельная нить, то работа не мешает обработчику сообщений. ----- Yann Tiersen best and do not fuck |
|
Создано: 29 сентября 2010 10:09 · Личное сообщение · #14 PE_Kill + 100 Добавлю, что увеличить производительность может буферизованное добавление. Я делал так: В другом потоке расширял и заполнял буфер (за концом строки указатель на следующую), при накапливании текста осуществлялась проверка, не истекло ли 20 мс (GetTickCount). Если истекло, считал длину накопленного текста, упаковывал в буфер и оттуда уже в текстовый контрол. Такой алгоритм избавляет от избыточной очереди сообщений. ----- IZ.RU |
|
Создано: 29 сентября 2010 17:04 · Личное сообщение · #15 |
|
Создано: 29 сентября 2010 19:04 · Личное сообщение · #16 Isaev почитай основы Win32 программирования. Именно так и советуют поступать. Если действия по времени продолжительные и мешают нормальному функционированию менеджеру сообщений, то да, пихай всё это в отдельный Thread. У меня есть проект, насчитывающий более 10 000 строк кода и всё это запихано в отдельную нить, а основная как раз и отвечает только за обработку оконных сообщений. Просто есть задачи, которые ты хоть как извратись, не сделаешь в основной нити, т.к. не можешь управлять очередью сообщений: блокирующие сокеты, Debug API, Events и многое многое другое. Поэтому стоит изначально правильно строить код, чтобы в последствие не переписывать всё с нуля. ----- Yann Tiersen best and do not fuck |
|
Создано: 29 сентября 2010 20:35 · Личное сообщение · #17 |
eXeL@B —› Программирование —› Пауза в Delphi |
Эта тема закрыта. Ответы больше не принимаются. |