Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Борьба с зависанием формы

Ответить
Настройки темы
Delphi - Борьба с зависанием формы

Аватара для Professor_J.C.

Пользователь


Сообщения: 97
Благодарности: 7


Конфигурация

Профиль | Отправить PM | Цитировать


Вопрос наверняка классический, но все-таки...
Есть форма, на форме кнопка, запускающая (и, в теории, останавливающая) некоторую обработку, и прогрессбар, показывающий процент выполнения. Во время выполнения обработки форма нещадно зависает.

Дальше идет лирика, этот абзац можно пропустить...
Для решения этой проблемы сначала я использовал 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

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Борьба с зависанием формы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Искажение с последующим зависанием 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




 
Переход