![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Борьба с зависанием формы |
|
Delphi - Борьба с зависанием формы
|
Пользователь Сообщения: 97 |
Вопрос наверняка классический, но все-таки...
Есть форма, на форме кнопка, запускающая (и, в теории, останавливающая) некоторую обработку, и прогрессбар, показывающий процент выполнения. Во время выполнения обработки форма нещадно зависает. Дальше идет лирика, этот абзац можно пропустить... Для решения этой проблемы сначала я использовал Application.ProcessMessages, но это скорее костыль чем решение, ибо если в не получается его часто вызывать, то обновление формы происходит как минимум пару раз за все время, чего явно недостаточно чтобы, например, нажать на стоп. Следующим приближением стало использование TThread. При запуске обработки в отдельном треде ситуация почему-то не изменилась. Форма как зависала, так и зависает, да ещё и выполнение обработки замедлилось. CreateThread и WaitForSingleObject из WinAPI частично решили проблему, т.е. форма не виснет, но я не могу понять как завершить тред принудительно, все способы которые я на данный момент вычитал в интернетах не сработали. //это выполняется в отдельном треде function MyNewThread(pParam : POINTER) :dword; stdcall; begin Main.errcode:=MainForm.GetRadio(mode); PulseEvent(Cardinal(pParam^)); end; //так происходит вызов, движение прогрессбара и завершение //создание потока hEvent := CreateEvent(nil, True, False, nil); HThread1:=CreateThread (nil, 0, @MyNewThread, @hEvent, 0, tid); //обновляем прогрессбар while ProgressBar.Position<100 do begin ProgressBar.Position:=DownloadProgress; ... Application.ProcessMessages; end; //ждем завершения потока WaitForSingleObject(hEvent, INFINITE); //убиваем поток CloseHandle(hEvent); hEvent := 0; |
|
------- Отправлено: 22:09, 12-04-2011 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Искажение с последующим зависанием | sylar3000 | Непонятные проблемы с Железом | 3 | 12-04-2010 14:01 | |
Прочее - [решено] Отключается интернет с зависанием компа | sasha-lav | Сетевые технологии | 4 | 26-10-2009 23:03 | |
Ошибка - [решено] Проблема с зависанием компьютера | Sergey39 | Microsoft Windows 2000/XP | 4 | 06-08-2009 23:59 | |
Звук - Проблема с зависанием ОС при воспроизведении звука на Audigy 2 ZS | Wanderer57 | Прочее железо | 6 | 13-11-2008 20:40 | |
[решено] Проблема с зависанием | 7enoff | Microsoft Windows NT/2000/2003 | 1 | 07-07-2008 14:14 |
|