Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Борьба с зависанием формы (http://forum.oszone.net/showthread.php?t=204627)

Professor_J.C. 12-04-2011 22:09 1656838

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

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

Помогите разобраться, как завершить поток принудительно?


Время: 21:49.

Время: 21:49.
© OSzone.net 2001-