Professor_J.C.
12-04-2011, 22:09
Вопрос наверняка классический, но все-таки...
Есть форма, на форме кнопка, запускающая (и, в теории, останавливающая) некоторую обработку, и прогрессбар, показывающий процент выполнения. Во время выполнения обработки форма нещадно зависает.
Дальше идет лирика, этот абзац можно пропустить...
Для решения этой проблемы сначала я использовал 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;
Помогите разобраться, как завершить поток принудительно?
Есть форма, на форме кнопка, запускающая (и, в теории, останавливающая) некоторую обработку, и прогрессбар, показывающий процент выполнения. Во время выполнения обработки форма нещадно зависает.
Дальше идет лирика, этот абзац можно пропустить...
Для решения этой проблемы сначала я использовал 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;
Помогите разобраться, как завершить поток принудительно?